Aggiunta di percorsi a PATH usando una sintassi multilinea


16

Per quanto ho capito, il solito modo di aggiungere un percorso alla PATHvariabile d'ambiente è concatenare percorsi separati dal :carattere.

Per esempio, se voglio aggiungere tre percorsi ad esso /my/path/1, /my/path/2e /my/path/3, avrei dovuto farlo nel modo seguente:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

che non è facile da leggere.

C'è un modo per definire o aggiungere percorsi alla PATHvariabile usando una sintassi multilinea ? Forse usando array? Sto cercando qualcosa del genere:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

Nel caso in cui ci siano soluzioni interessanti specifiche della shell, sto cercando una soluzione in zsh.

Risposte:


12

Non so se funziona in zsh, ma funziona in bash:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

Modifica e ancora più breve:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

E senza generare un processo:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

Le virgolette sono importanti arround $PATH, $IFS, ${new_path[*]}e $OLD_IFSper mantenere gli spazi di interpretazione variabili ed evitare guscio di IFS.

Update2 con commenti e gestione della riga vuota usando sed:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

Il carattere di commento deve essere il 1 ° carattere sulla riga e le righe vuote devono essere completamente vuote. Per gestire gli spazi e le schede prima del commento e su righe vuote, utilizzare sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dinvece (schede da testare in quanto potrebbe essere specifico per l'implementazione di sed).


Ho testato l'ultimo frammento in zsh e funziona. Mi piace anche che sia un po 'più pulito (un percorso per riga) rispetto alle altre soluzioni. La soluzione può accogliere linee (percorsi) commentate? Che ne dici di linee vuote?
Amelio Vazquez-Reina

Aggiornamento con commenti e gestione della riga vuota.
jfg956,

E con sed, se vuoi giocare, puoi evitare il processo incolla con uno script più complicato.
jfg956,

È corretto utilizzare il rientro per i percorsi nella pastesoluzione?
void.pointer

20

Non è una soluzione interessante, ma molto portatile:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
Questo è tipico di ciò che ho visto negli anni. Si può facilmente riordinare i percorsi o persino modificare un elemento in PATH = / my / path / 1: $ {PATH} per forzare la prepending.
bsd

1
È inoltre possibile utilizzare +=per evitare di dover ricostruire completamente la stringa.
Chris Down,

E non hai nemmeno bisogno di usare le parentesi graffe. I due punti non possono essere utilizzati nei nomi delle variabili di ambiente, quindi non c'è alcuna ambiguità da risolvere.
Alexios

+1 per non essere interessante. Interessante può essere buono a volte, ma questa non è una di quelle volte! (Soprattutto dal momento che l'OP ha esplicitamente menzionato "non facile da leggere" come problema.)
ruakh

@ChrisDown Esiste una sintassi che antepone senza ricostruire la stringa?
John P,

12

In zsh, $pathè un array:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

Nota: entrambi pathsono minuscoli.


Dipende dalla shell, non tutti gestiscono questo.
vonbrand,

1
@vonbrand: Sì, ma funziona in zsh. Penso che valga la pena menzionarlo.
Kabie,

3
+1 (Questa domanda è taggata zsh )
Johnsyweb,

Dato che l'OP ha chiesto specificamente di zsh, questa è l'opzione migliore
Daniel Serodio,

1
per chiunque sia interessato a saperne di più sul percorso $ path vs. $ PATH, consulta questo post
mbigras

7

In zsh, se aggiungi le directory alla fine del percorso:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

Portabilmente: come aggiungere correttamente un percorso a PATH?

È possibile utilizzare i qualificatori glob per escludere voci che non sono directory esistenti o collegamenti simbolici a tali. Ciò può essere desiderabile o meno, a seconda che si preveda che le directory possano essere aggiunte in un secondo momento durante la sessione (ad es. Se si trovano su filesystem remoti). Non puoi farlo con la path+=/my/pathsintassi perché il lato destro si trova in un contesto di stringa e quindi non subisce globbing; è possibile farlo path+=(/my/path)poiché ogni elemento dell'array viene espanso in un contesto di elenco.

path+=(/path/to/app/{i386,share}/bin(-/N))
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.