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 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
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.
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.
Jawaban:
Tambahkan secara rekursif menggunakan find seperti:
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
sumber
$PATH
berbahaya, tetapi menambahkan subdirektori tidak terlalu buruk. Tapi itu biasanya tidak berguna , dan mungkin tidak efisien (dan kadang-kadang bahkan membuat Anda batas ukuran lingkungan)~/bin
atau~/scripts
), sehingga keamanannya sama.~/scripts
. Saya tidak dan seharusnya tidak ada orang lainStruktur direktori unix yang biasa memiliki file aplikasi diurutkan ke dalam direktori berdasarkan jenis:
bin
untuk executable,lib
untuk perpustakaan,doc
untuk 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/bin
dan/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
bin
subdirektori dari subdirektori dari direktori yang diberikan dalam$PATH
:Namun, ini jarang dilakukan. Metode yang biasa ketika executable di direktori non-standar
$PATH
adalah untuk membuat tautan simbolik dalam direktori di jalur seperti/usr/local/bin
. Thestow
utilitas (atauxstow
) dapat berguna dalam hal itu.sumber
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
$PATH
menyertakan/usr/local/bin
(yang kemungkinan besar terjadi) folder itu penuh dengan tautan simbolis (sepertiruby
) 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.sumber
Di zsh , $ PATH dapat ditambahkan sebagai array. Anda dapat menggunakan shell globbing untuk menambahkan beberapa subdirektori ke array $ PATH.
Contoh:
Dalam
.zshrc
:Ini akan menambahkan semua subdirektori dari $ BINPATH ke array $ PATH.
sumber