Aggiunta di una nuova voce alla variabile PATH in ZSH


188

Sto usando zsh e sto provando ad aggiungere una nuova voce ( /home/david/pear/bin) alla PATHvariabile ma non so come.

La cosa che mi confonde di più è che non c'è un singolo riferimento a una PATHvariabile nel mio ~/.zshrcfile, ma che echo $PATHrestituisce:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Quindi una PATHvariabile viene impostata da qualche parte.

Risposte:


213

Qui, aggiungi questa linea a .zshrc:

export PATH=/home/david/pear/bin:$PATH

EDIT : Questo funziona, ma la risposta di Ony qui sotto è migliore, in quanto sfrutta l'interfaccia strutturata che ZSH fornisce variabili come $PATH. Questo approccio è standard bash, ma per quanto ne so, non c'è motivo di usarlo quando ZSH offre alternative migliori.


29
ahah dimenticalo, pensavo fosse solo un comando da console, ma l'aggiunta di quella linea a .zshrc ha funzionato. Molte grazie!
David Barreto,

1
Il mio .zshrc aveva già una linea per l'esportazione PATH, quindi l'ho sostituito con quello modificato.
Zack Huston,

6
Ho dovuto togliere le virgolette attorno alle voci cioè PATH="/home/david/pear/bin:/usr/bin:etc"per PATH=/home/david/pear/bin:/usr/bin:etcper poter rimanere in zshrc.
a7omiton,

3
@taco, puoi usare $ HOME
mencargo il

1
@DanielSpringer: Sì. Quando apri una shell che eredita PATHdal processo genitore che l'ha avviata, e poi quando viene eseguita .zshrc( .bashrco qualsiasi altra cosa), questo è ciò che ti consente di aggiungere cose extra a quel percorso.
Linuxios,

224

In realtà, l'utilizzo di ZSH consente di utilizzare una mappatura speciale delle variabili di ambiente. Quindi puoi semplicemente fare:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

Per me questa è una caratteristica molto accurata che può essere propagata ad altre variabili. Esempio:

typeset -T LD_LIBRARY_PATH ld_library_path :

16
Bella risposta. Nel mio caso, ~/.zshrcè di provenienza successiva .profilee sovrascrive tutto .profile. Mi ci è voluto un po 'tirandomi i capelli per capirlo.
Khanh Nguyen,

1
Il caso append non ha bisogno delle parentesi a meno che tu non stia aggiungendo più di un elemento. Inoltre spesso non ha bisogno delle virgolette. Quindi il modo semplice e breve per aggiungere è
Micah Elliott l'

1
@SuperUberDuper, dovresti capire che quasi tutte le shell unix leggono semplicemente i file di avvio che fanno quasi la stessa cosa che se dovessi digitare in modo interattivo nella shell. Per quanto riguarda i file "rc" potresti trovare una risposta interessante a questa domanda
solo il

6
È possibile evitare l'esportazione esplicita con -xe lasciare solo valori univoci in una variabile con -U, i due punti sono assunti di default, quindi può essere:typeset -TUx PATH path
Lutto

2
@DanielSpringer, no. Se lo vuoi in questi termini, allora: path=(...)(senza riferimento $patho $PATHdentro) assegna, path=(... $path)antepone e path+(...)accoda.
ony

40

Puoi aggiungere al tuo PATHin modo minimale. Non sono necessarie parentesi a meno che non si stia aggiungendo più di un elemento. Inoltre di solito non ha bisogno di preventivi. Quindi il modo semplice e breve per aggiungere è:

path+=/some/new/bin/dir

Uso comune

Quindi il modello comune per testare un nuovo script / eseguibile diventa:

path+=$PWD/.
# or
path+=$PWD/bin

Questa sintassi in lettere minuscole viene utilizzata pathcome matrice , ma influisce anche sull'equivalente in maiuscolo del partner PATH(a cui è "associato" tramite typeset).

(Si noti che non :è necessario / voluto come separatore .)

Bocconcini correlati

Trattare in pathquesto modo (come un array) significa anche: non c'è bisogno di fare un rehash per trovare i comandi appena percorsi.

Guarda anche vared pathcome un modo dinamico per modificarepath e altre cose.

Potresti essere interessato solo a pathquesta domanda, ma poiché stiamo parlando di esportazioni e array, tieni presente che gli array generalmente non possono essere esportati.

Puoi persino impedire diPATH inserire voci duplicate ( fai riferimento a questo e questo ):

typeset -U path

Non dovrebbe essere 'path + =: / foo / bar'? (con due punti)
Andrew Lorien,

1
@andrewlorien Ho aggiornato la risposta con i dettagli sul separatore di due punti.
Micah Elliott,

Nota che se c'è un commento dopo il percorso, allora abbiamo bisogno di virgolette, come path+='my/path' # for fun. È ovvio se hai spazi, ma non tanto se hai commenti.
Franklin Yu,

"(Notare che no: è necessario / voluto come separatore.)" Questo vale solo per le lettere minuscole path. È :richiesto un precedente PATH, come segue in .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.

37

una fodera, senza aprire il ~/.zshrcfile

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

o

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

Per vedere l'effetto, fai source ~/.zshrcnella stessa scheda o apri una nuova scheda


1
Ha funzionato perfettamente su OSX con shell Zsh.
Stryker,

1
Ha funzionato come un fascino!
Akbar Sha Ebrahim,

14
  1. Aggiunto percorso a ~ / .zshrc

    sudo vi ~/.zshrc

    aggiungi nuovo percorso

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Aggiornamento ~ / .zshrc

    Salva ~ / .zshrc

    source ~/.zshrc

  3. Controlla il PERCORSO

    echo $PATH


2
Questo è il Bashmodo.
Cugina Cocaina,

13

OPZIONE 1: aggiungere questa riga a ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

Successivamente è necessario eseguire source ~/.zshrcper rendere effettive le modifiche OPPURE chiudere questa finestra e aprirne una nuova

OPZIONE 2: eseguirlo nella console del terminale per aggiungere questo percorso solo alla sessione della finestra del terminale corrente. Quando chiudi la finestra / sessione, andrà persa.


Puoi approfondire in che modo questa risposta è diversa dalla stessa risposta postata 5 anni fa ?
Franklin Yu,

in questa risposta non si dice che devi aggiungere questa riga di codice al file, se lo esegui in questo modo cambierà solo nelle finestre correnti e questo non è spiegato nella risposta originale
Dimitar
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.