Bagaimana saya bisa mengatur semua subdirektori dari suatu direktori menjadi $ PATH?

38

Sepertinya ketika menambahkan direktori ke $ PATH, subdirektori tidak ditambahkan secara rekursif. Jadi bisakah saya melakukan itu? Atau adakah alasan mengapa ini tidak didukung?

Tim
sumber
5
Kenapa kamu membutuhkan itu?
alex
10
@alex: Mengapa Anda pikir tidak perlu?
Tim
4
@Tim alasan mengapa itu tidak "umumnya" didukung adalah risiko keamanan dan umumnya tidak diperlukan. Jika Anda secara rekursif menambahkan direktori ke jalur Anda yang tahu apa yang mungkin macet di sana ... membuatnya lebih sulit untuk diaudit.
xenoterracide
4
@Tim: itu hal yang sangat mengejutkan dan tidak biasa diinginkan, itu sebabnya.
alex
8
@ alex bagaimana dengan untuk subdirektori dalam direktori bin? saya ingin mengatur skrip dalam direktori di folder bin.
Andy

Jawaban:

19

Tambahkan secara rekursif menggunakan find seperti:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

PERINGATAN: Seperti disebutkan dalam komentar untuk pertanyaan ini tidak dianjurkan karena menimbulkan risiko keamanan karena tidak ada jaminan bahwa file yang dapat dieksekusi dalam direktori yang ditambahkan tidak berbahaya.

Mungkin ini solusi yang lebih baik untuk mengikuti jawaban Gilles dan menggunakan stow

Vschum
sumber
6
Peringatan: Jawaban ini secara teknis benar tetapi sebagai catatan alex dan xenoterracide ini adalah hal yang tidak aman untuk dilakukan dan Anda harus berpikir dua kali sebelum benar-benar menggunakan ini.
Caleb
2
Harap tambahkan peringatan pada jawaban Anda tentang mengapa ini bukan hal yang baik dan aman untuk dilakukan dalam praktik.
Caleb
3
Saya tidak akan menganggapnya sangat berbahaya ; menambahkan direktori acak ke $PATHberbahaya, tetapi menambahkan subdirektori tidak terlalu buruk. Tapi itu biasanya tidak berguna , dan mungkin tidak efisien (dan kadang-kadang bahkan membuat Anda batas ukuran lingkungan)
Gilles 'SANGAT berhenti menjadi jahat'
3
@ Caleb: gila mungkin, tapi mengapa tidak aman? Jika seseorang memiliki akses untuk menambahkan file yang dapat dieksekusi berbahaya dalam subdir, ia juga bisa menambahkannya ke dir induk (yaitu, ~/binatau ~/scripts), sehingga keamanannya sama.
MestreLion
2
Risiko keamanan jika Anda bekerja di lingkungan di mana orang-orang acak dapat menambahkan file berbahaya ke Anda ~/scripts. Saya tidak dan seharusnya tidak ada orang lain
oseiskar
21

Struktur direktori unix yang biasa memiliki file aplikasi diurutkan ke dalam direktori berdasarkan jenis: binuntuk executable, libuntuk perpustakaan, docuntuk dokumentasi dan sebagainya. Saat itulah mereka dipasang di direktori yang terpisah; sering aplikasi dikelompokkan menjadi beberapa direktori (maka banyak sistem memiliki hanya tiga direktori di $PATH: /usr/local/bin, /usr/bindan /bin). Jarang memiliki file dan subdirektori yang dapat dieksekusi di dalam direktori, jadi tidak ada permintaan untuk menyertakan subdirektori direktori $PATH.

Apa yang kadang-kadang berguna adalah untuk memasukkan semua binsubdirektori dari subdirektori dari direktori yang diberikan dalam $PATH:

for d in /opt/*/bin; do PATH="$PATH:$d"; done

Namun, ini jarang dilakukan. Metode yang biasa ketika executable di direktori non-standar $PATHadalah untuk membuat tautan simbolik dalam direktori di jalur seperti /usr/local/bin. The stowutilitas (atau xstow) dapat berguna dalam hal itu.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4

Salah satu alasan mengapa hal ini tidak didukung adalah karena direktori bin / (dan yang serupa) menggunakan tautan simbolik untuk menunjuk ke direktori spesifik di mana executable aktual untuk program diinstal.

Jadi, jika Anda $PATHmenyertakan /usr/local/bin(yang kemungkinan besar terjadi) folder itu penuh dengan tautan simbolis (seperti ruby) yang menunjuk ke direktori spesifik tempat kode untuk menjalankan ruby ​​ditemukan (seperti ../Cellar/ruby/2.1.3/bin/ruby).

Inilah sebabnya mengapa Anda tidak harus menentukan folder masing-masing yang dapat dieksekusi di Anda $PATH; tautan simbolik yang biasanya ditemukan di direktori bin / type menangani itu untuk Anda.

jeffmjack
sumber
1

Di zsh , $ PATH dapat ditambahkan sebagai array. Anda dapat menggunakan shell globbing untuk menambahkan beberapa subdirektori ke array $ PATH.

Contoh:

Dalam .zshrc:

typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH

Ini akan menambahkan semua subdirektori dari $ BINPATH ke array $ PATH.

anon_stackoverflock
sumber