Come posso impostare tutte le sottodirectory di una directory in $ PATH?


38

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?


5
Perché mai ne hai bisogno?
alex

10
@alex: Perché pensi che non ce ne sia bisogno?
Tim

4
@Tim il motivo per cui non è "generalmente" supportato è un rischio per la sicurezza e generalmente non è necessario. Se aggiungi ricorsivamente directory al tuo percorso chissà cosa potrebbe rimanere bloccato lì ... rende molto più difficile il controllo.
xenoterracide,

4
@Tim: è una cosa davvero sorprendente e insolita da desiderare, ecco perché.
alex

8
@alex che dire delle sottodirectory nella directory bin? mi piacerebbe organizzare gli script nelle directory nella cartella bin.
Andy,

Risposte:


19

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


6
Avvertenza: questa risposta è tecnicamente corretta, ma come notano alex e xenoterracide, questa è una cosa folle e insicura da fare e dovresti assolutamente pensarci due volte prima di usarlo.
Caleb,

2
Aggiungi un avviso alla tua risposta sul perché questa non è una cosa buona e sicura da fare in pratica.
Caleb,

3
Non lo considero particolarmente pericoloso ; l'aggiunta di directory casuali $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).
Gilles 'SO- smetti di essere malvagio' il

3
@Caleb: forse pazzo, ma perché insicuro? Se qualcuno ha accesso per aggiungere file eseguibili dannosi nei sottodirectory, potrebbe anche aggiungerli alla directory principale (ovvero, ~/bino ~/scripts), quindi la loro sicurezza è la stessa.
MestreLion

2
Rischio per la sicurezza se lavori in un ambiente in cui persone a caso possono aggiungere file dannosi al tuo ~/scripts. Io no e nessuno dovrebbe
farlo

21

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.


4

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.


1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.