Cơ sở lý luận cho /
quy tắc POSIX PATH
Quy tắc đã được đề cập tại: Tại sao bạn cần ./ (dấu chấm chéo) trước khi thực thi hoặc tên tập lệnh để chạy nó trong bash? nhưng tôi muốn giải thích tại sao tôi nghĩ rằng đó là một thiết kế tốt chi tiết hơn.
Đầu tiên, một phiên bản đầy đủ rõ ràng của quy tắc là:
- nếu đường dẫn chứa
/
(ví dụ ./someprog
, /bin/someprog
, ./bin/someprog
): CWD được sử dụng và không phải là PATH
- nếu đường dẫn không chứa
/
(ví dụ someprog
): PATH được sử dụng và CWD không
Bây giờ, giả sử rằng đang chạy:
someprog
sẽ tìm kiếm:
- liên quan đến CWD trước
- liên quan đến PATH sau
Sau đó, nếu bạn muốn chạy /bin/someprog
từ bản phân phối của mình và bạn đã làm:
someprog
đôi khi nó sẽ hoạt động, nhưng những cái khác nó sẽ thất bại, bởi vì bạn có thể đang ở trong một thư mục chứa một someprog
chương trình không liên quan khác .
Do đó, bạn sẽ sớm biết rằng điều này không đáng tin cậy và cuối cùng bạn sẽ luôn sử dụng các đường dẫn tuyệt đối khi bạn muốn sử dụng PATH, do đó đánh bại mục đích của PATH.
Đây cũng là lý do tại sao có các đường dẫn tương đối trong PATH của bạn là một ý tưởng thực sự tồi tệ. Tôi đang nhìn bạn ,node_modules/bin
.
Ngược lại, giả sử rằng đang chạy:
./someprog
Sẽ tìm kiếm:
- liên quan đến PATH trước
- liên quan đến CWD sau
Sau đó, nếu bạn vừa tải xuống một tập lệnh someprog
từ kho git và muốn chạy nó từ CWD, bạn sẽ không bao giờ chắc chắn rằng đây là chương trình thực tế sẽ chạy, bởi vì có thể bản phân phối của bạn có:
/bin/someprog
đó là trong bạn PATH từ một số gói bạn đã cài đặt sau khi uống quá nhiều sau Giáng sinh năm ngoái.
Do đó, một lần nữa, bạn sẽ buộc phải luôn chạy các tập lệnh cục bộ liên quan đến CWD với các đường dẫn đầy đủ để biết bạn đang chạy gì:
"$(pwd)/someprog"
Điều này cũng sẽ vô cùng khó chịu.
Một quy tắc khác mà bạn có thể muốn đưa ra là:
đường dẫn tương đối chỉ sử dụng PATH, đường dẫn tuyệt đối chỉ CWD
nhưng một lần nữa, điều này buộc người dùng luôn phải sử dụng các đường dẫn tuyệt đối cho các tập lệnh không phải PATH với "$(pwd)/someprog"
.
Các /
quy tắc tìm kiếm con đường cung cấp một đơn giản để nhớ giải pháp cho các vấn đề về:
- dấu gạch chéo: không sử dụng
PATH
- không gạch chéo: chỉ sử dụng
PATH
Điều này giúp bạn luôn dễ dàng biết được những gì bạn đang chạy, bằng cách dựa vào thực tế là các tệp trong thư mục hiện tại có thể được thể hiện dưới dạng ./somefile
hoặc somefile
, và do đó nó mang lại ý nghĩa đặc biệt cho một trong số chúng.
Đôi khi, hơi khó chịu khi bạn không thể tìm kiếm some/prog
liên quan PATH
, nhưng tôi không thấy giải pháp nào cho vấn đề này.