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).
~/bino ~/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: binper eseguibili, liblibrerie, docdocumentazione 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/bine /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 binsottodirectory 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 $PATHcreare collegamenti simbolici in una directory nel percorso come /usr/local/bin. L' stowutilità (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 $PATHincludi /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.