Sembra che quando si aggiunge una directory in $ PATH, le sue sottodirectory non vengono aggiunte in modo ricorsivo. Quindi posso farlo? O c'è un motivo per cui questo non è supportato?
Sembra che quando si aggiunge una directory in $ PATH, le sue sottodirectory non vengono aggiunte in modo ricorsivo. Quindi posso farlo? O c'è un motivo per cui questo non è supportato?
Risposte:
Aggiungili in modo ricorsivo usando find in questo modo:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
ATTENZIONE: Come menzionato nei commenti alla domanda, questo non è incoraggiato in quanto rappresenta un rischio per la sicurezza perché non vi è alcuna garanzia che i file eseguibili nelle directory aggiunte non siano dannosi.
È probabilmente una soluzione migliore per seguire la risposta di Gilles e usare stow
$PATH
è pericolosa, ma l'aggiunta di sottodirectory non è nettamente peggiore. Ma di solito è inutile e forse inefficiente (e talvolta potrebbe persino buttarti sui limiti delle dimensioni dell'ambiente).
~/bin
o ~/scripts
), quindi la loro sicurezza è la stessa.
~/scripts
. Io no e nessuno dovrebbe
La consueta struttura di directory unix ha i file dell'applicazione ordinati in directory per tipo: bin
per eseguibili, lib
librerie, doc
documentazione e così via. Questo è quando sono installati in directory separate; Spesso le applicazioni sono raggruppati in alcune directory (quindi molti sistemi hanno solo tre directory in $PATH
: /usr/local/bin
, /usr/bin
e /bin
). È raro avere sia file eseguibili che sottodirectory all'interno di una directory, quindi non è necessario includere le sottodirectory di una directory $PATH
.
Ciò che potrebbe essere utile occasionalmente è includere tutte le bin
sottodirectory delle sottodirectory di una determinata directory in $PATH
:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
Tuttavia, questo viene fatto raramente. Il solito metodo in cui devono trovarsi gli eseguibili in directory non standard consiste nel $PATH
creare collegamenti simbolici in una directory nel percorso come /usr/local/bin
. L' stow
utilità (o xstow
) può essere utile al riguardo.
Uno dei motivi per cui questo non è supportato è perché le directory bin / (e simili) usano collegamenti simbolici per puntare alle directory specifiche in cui sono installati gli eseguibili effettivi per i programmi.
Quindi, se $PATH
includi /usr/local/bin
(cosa che molto probabilmente fa) quella cartella è piena di collegamenti simbolici (come ruby
) che puntano alla directory specifica in cui si trova il codice per eseguire ruby (come ../Cellar/ruby/2.1.3/bin/ruby
).
Questo è il motivo per cui non devi specificare la cartella di ogni eseguibile nella tua $PATH
; i collegamenti simbolici che si trovano abitualmente nelle directory bin / type lo gestiscono per te.
In zsh , $ PATH può essere aggiunto come un array. È possibile utilizzare il globbing della shell per aggiungere più sottodirectory all'array $ PATH.
Esempio:
Nel .zshrc
:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
Questo aggiungerà tutte le sottodirectory di $ BINPATH all'array $ PATH.