Làm cách nào tôi có thể đặt tất cả các thư mục con của thư mục thành $ PATH?


38

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ợ?


5
Tại sao bạn cần điều đó?
alex

10
@alex: Tại sao bạn nghĩ không có nhu cầu?
Tim

4
@Tim lý do nó không "thường" được hỗ trợ là rủi ro bảo mật và thường không cần thiết. Nếu bạn đệ quy thêm các thư mục vào đường dẫn của bạn, người biết những gì có thể bị mắc kẹt trong đó ... sẽ khiến việc kiểm toán trở nên khó khăn hơn rất nhiều.
xenoterracide

4
@Tim: đó là một điều thực sự đáng ngạc nhiên và bất thường muốn, đó là lý do tại sao.
alex

8
@alex những gì về thư mục con trong thư mục bin? Tôi muốn tổ chức các tập lệnh trong các thư mục trong thư mục bin.
Andy

Câu trả lời:


19

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


6
Cảnh báo: Câu trả lời này đúng về mặt kỹ thuật nhưng như alex và xenoterracide lưu ý đây là một điều không an toàn để làm và bạn chắc chắn nên suy nghĩ kỹ trước khi thực sự sử dụng nó.
Caleb

2
Vui lòng thêm một cảnh báo cho câu trả lời của bạn về lý do tại sao điều này không phải là một điều tốt, an toàn để làm trong thực tế.
Caleb

3
Tôi sẽ không coi nó là đặc biệt nguy hiểm ; thêm thư mục ngẫu nhiên vào $PATHlà 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).
Gilles 'SO- ngừng trở nên xấu xa'

3
@Caleb: có lẽ điên, nhưng tại sao không an toàn? Nếu ai đó có quyền truy cập để thêm các tệp thực thi độc hại trong thư mục con, anh ta cũng có thể thêm chúng vào thư mục gốc (nghĩa là ~/binhoặc ~/scripts), vì vậy bảo mật của chúng là như nhau.
MestreLion

2
Rủi ro bảo mật nếu bạn làm việc trong môi trường mà những người ngẫu nhiên có thể thêm các tệp độc hại vào của bạn ~/scripts. Tôi cũng không nên và bất kỳ ai khác
oseiskar

21

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: bincho các tệp thực thi, libcho các thư viện, doccho 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/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 binthư 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 $PATHlà để 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 stowtiện ích (hoặc xstow) có thể hữu ích trong vấn đề đó.


4

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 $PATHbao 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.