Có vẻ như khi thêm một thư mục vào $ PATH, các thư mục con của nó không được thêm đệ quy. Vì vậy, tôi có thể làm điều đó? Hoặc có một lý do tại sao điều này không được hỗ trợ?
Có vẻ như khi thêm một thư mục vào $ PATH, các thư mục con của nó không được thêm đệ quy. Vì vậy, tôi có thể làm điều đó? Hoặc có một lý do tại sao điều này không được hỗ trợ?
Câu trả lời:
Thêm chúng đệ quy bằng cách sử dụng find như vậy:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
CẢNH BÁO: Như đã đề cập trong các nhận xét cho câu hỏi, điều này không được khuyến khích vì nó gây ra rủi ro bảo mật vì không có gì đảm bảo rằng các tệp thực thi trong các thư mục được thêm vào không độc hại.
Đây có lẽ là một giải pháp tốt hơn để làm theo câu trả lời của Gilles và sử dụng stow
$PATH
là nguy hiểm, nhưng thêm thư mục con không tệ hơn rõ rệt. Nhưng nó thường vô dụng , và có thể không hiệu quả (và thậm chí đôi khi có thể ném bạn vào giới hạn kích thước môi trường).
~/bin
hoặc ~/scripts
), vì vậy bảo mật của chúng là như nhau.
~/scripts
. Tôi cũng không nên và bất kỳ ai khác
Cấu trúc thư mục unix thông thường có các tệp ứng dụng được sắp xếp vào các thư mục theo loại: bin
cho các tệp thực thi, lib
cho các thư viện, doc
cho các tài liệu, v.v. Đó là khi chúng được cài đặt trong các thư mục riêng biệt; thường các ứng dụng được nhóm vào một vài thư mục (do đó nhiều hệ thống chỉ có ba thư mục trong $PATH
: /usr/local/bin
, /usr/bin
và /bin
). Rất hiếm khi có cả tệp thực thi và thư mục con trong một thư mục, vì vậy không có nhu cầu bao gồm các thư mục con của thư mục $PATH
.
Điều đôi khi có thể hữu ích là bao gồm tất cả các bin
thư mục con của thư mục con của một thư mục đã cho trong $PATH
:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Tuy nhiên, điều này hiếm khi được thực hiện. Phương thức thông thường khi thực thi trong các thư mục không chuẩn $PATH
là để tạo các liên kết tượng trưng trong một thư mục trong đường dẫn như /usr/local/bin
. Các stow
tiện ích (hoặc xstow
) có thể hữu ích trong vấn đề đó.
Một lý do mà điều này không được hỗ trợ là vì các thư mục bin / (và tương tự) sử dụng các liên kết tượng trưng để trỏ đến các thư mục cụ thể nơi thực thi thực tế cho các chương trình được cài đặt.
Vì vậy, nếu bạn $PATH
bao gồm /usr/local/bin
(mà nó rất có thể không) thư mục đó là đầy đủ các liên kết tượng trưng (như ruby
) mà trỏ đến thư mục cụ thể mà mã để chạy ruby được tìm thấy (như ../Cellar/ruby/2.1.3/bin/ruby
).
Đây là lý do tại sao bạn không phải chỉ định từng thư mục thực thi trong $PATH
; các liên kết tượng trưng thường được tìm thấy trong các thư mục bin / type xử lý việc đó cho bạn.