Tiêu chuẩn vỏ POSIX cho biết trên trang web này
http://pub.opengroup.org/onlinepub/9699919799/
về cách shell sử dụng PATH
để tìm kiếm các tệp thực thi:
"Danh sách sẽ được tìm kiếm từ đầu đến cuối, áp dụng tên tệp cho từng tiền tố, cho đến khi tìm thấy tệp thực thi có tên được chỉ định và quyền thực thi phù hợp."
Chà, đây không phải là cách nó hoạt động trong triển khai POSIX thực sự:
man which
nói:
"trả về tên đường dẫn của các tệp (hoặc liên kết) sẽ được thực thi trong môi trường hiện tại, các đối số của nó được đưa ra dưới dạng các lệnh trong trình bao tuân thủ POSIX nghiêm ngặt. Nó thực hiện điều này bằng cách tìm kiếm PATH để tìm các tệp thực thi khớp với tên của tệp đối số. Nó không theo các liên kết tượng trưng. "
OK, chúng ta hãy xem xét tình huống này:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
OK, đây là một liên kết tượng trưng PATH
với tên chính xác và nó được báo cáo ls
là có thể thực thi được.
which
không nhìn vào nó chút nào, mà chỉ quan tâm đến những gì nó chỉ vào.
Điều đó mặc dù thực tế là cả hai đều man which
nói rõ ràng rằng nó không tuân theo các liên kết tượng trưng (và thực tế chúng ta thấy nó không, bởi vì which foobar
không in foobar1
), và tài liệu shell POSIX được trích dẫn ở trên, không bao giờ đề cập đến các liên kết tượng trưng trong PATH
thuật toán.
Vì vậy, là which
và các shell hiện có sai, hoặc tôi không hiểu tài liệu?
LÀM RÕ:
Tôi biết và có thể giải thích các hành vi hiện có. Câu hỏi của tôi không phải là "làm thế nào để làm việc này?". Điều đó tôi biết.
Câu hỏi của tôi là về tài liệu: lỗi của tôi ở đâu trong việc làm theo tài liệu mà tôi đã trích dẫn. Hoặc là tài liệu sai?
ĐỘNG LỰC: Tại sao tôi quan tâm?
Vâng, tôi là một người thực hiện. Người thực hiện khác nhau có yêu cầu khác nhau. Đối với tôi, yêu cầu là từ của tiêu chuẩn POSIX hiện tại PHẢI được tuân theo CHÍNH XÁC (hay chính xác hơn là tốt nhất có thể, bởi vì, bản thân tiêu chuẩn có phần lỗi). Giống như đó là lời của Thiên Chúa.
Bây giờ, từ ngữ tiêu chuẩn là khá rõ ràng - sau đây các liên kết tượng trưng không được đề cập, trong đó ở nhiều nơi khác, nó được đề cập đến nơi cần phải được thực hiện. Vì vậy, trong trường hợp này, không.
Tuy nhiên, tôi luôn kiểm tra lại cách cư xử dash
và bash
hành xử, chỉ để đảm bảo. Bây giờ tất nhiên, có một vấn đề nhỏ ở đây, dash
mặc dù nó được lập hóa đơn là POSIX, có rất nhiều lỗi nhỏ phù hợp với POSIX. bash
, Tôi vẫn chưa tìm thấy bất kỳ lỗi nào với POSIX, nhưng ... bash không thực sự là POSIX, nó còn hơn thế nữa.
Vì vậy, có bạn có nó. Đó là lý do tại sao tôi quan tâm.
$PATH
không có bất kỳ liên kết tượng trưng nào.
lstat(2)
), theo sau chúng thường không được nêu. Ví dụ, mô tả open(2)
chỉ đề cập đến các liên kết tượng trưng khi nói về hành vi của O_CREAT | O_EXCL
. Không cần phải nói rằng tệp mục tiêu sẽ được mở.
$PATH
có thể chứa liên kết tượng trưng. Hãy thửwhich sh
.