Ajout d'une nouvelle entrée à la variable PATH dans ZSH

189

J'utilise zsh et j'essaye d'ajouter une nouvelle entrée (/home/david/pear/bin ) à la PATHvariable mais je ne sais pas comment.

Ce qui me déroute le plus, c'est qu'il n'y a pas une seule référence à une PATHvariable dans mon ~/.zshrcfichier, mais faire des echo $PATHretours:

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

Donc, une PATHvariable est définie quelque part.

David Barreto
la source

Réponses:

214

Ici, ajoutez cette ligne à .zshrc:

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

EDIT : Cela fonctionne, mais la réponse ci-dessous est meilleure, car elle tire parti de l'interface structurée que ZSH fournit pour des variables telles que $PATH. Cette approche est standard pour bash, mais pour autant que je sache, il n'y a aucune raison de l'utiliser lorsque ZSH fournit de meilleures alternatives.

Linuxios
la source
29
haha oublier, je pensais que ce n'était qu'une commande de console mais l'ajout de cette ligne au .zshrc a fait l'affaire. Merci beaucoup!
David Barreto
1
Mon .zshrc avait déjà une ligne pour l'exportation PATH, je l'ai donc remplacée par celle modifiée.
Zack Huston
6
J'ai dû supprimer les guillemets doubles autour des entrées, c'est- PATH="/home/david/pear/bin:/usr/bin:etc"à- dire PATH=/home/david/pear/bin:/usr/bin:etcpour qu'il reste dans zshrc.
a7omiton
3
@taco, vous pouvez utiliser $ HOME
mencargo
1
@DanielSpringer: Oui. Lorsque vous ouvrez un shell, il hérite PATHdu processus parent qui l'a démarré, puis quand il s'exécute .zshrc( .bashrcou quoi que ce soit), c'est ce qui vous permet d'ajouter des éléments supplémentaires à ce chemin.
Linuxios
224

En fait, l'utilisation de ZSH vous permet d'utiliser un mappage spécial des variables d'environnement. Vous pouvez donc simplement faire:

# 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

Pour moi, c'est une fonctionnalité très intéressante qui peut être propagée à d'autres variables. Exemple:

typeset -T LD_LIBRARY_PATH ld_library_path :
seulement
la source
16
Bonne réponse. Dans mon cas, ~/.zshrcprovient après .profileet écrase tout dans .profile. Il a fallu du temps pour me tirer les cheveux pour comprendre.
Khanh Nguyen
1
La casse d'ajout n'a pas besoin des parenthèses, sauf si vous ajoutez plus d'un élément. Il n'a souvent pas non plus besoin des citations. Donc, le moyen simple et court d'ajouter est
Micah Elliott
1
@SuperUberDuper, vous devez comprendre que presque tous les shell Unix lisent simplement les fichiers de démarrage, ce qui fait presque la même chose que si vous les saisissiez dans le shell de manière interactive. En ce qui concerne les fichiers « rc » vous pourriez trouver réponse intéressante à cette question
ony
6
Il est possible d'éviter l'exportation explicite avec -xet de ne laisser que des valeurs uniques dans une variable avec -U, deux points sont supposés par défaut, donc cela peut être:typeset -TUx PATH path
Grief
2
@DanielSpringer, non. Si vous le souhaitez dans ces termes, alors: path=(...)(sans référence $pathni à l' $PATHintérieur) attribue, path=(... $path)ajoute et path+(...)ajoute.
ony
40

Vous pouvez ajouter à votre PATHde manière minimale. Pas besoin de parenthèses, sauf si vous ajoutez plus d'un élément. Il n'a généralement pas besoin de citations. Donc, le moyen simple et court d'ajouter est:

path+=/some/new/bin/dir

Usage courant

Ensuite, le modèle commun pour tester un nouveau script / exécutable devient:

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

Cette syntaxe minuscule est utilisée pathcomme tableau , mais affecte également son équivalent partenaire majuscule, PATH(auquel elle est "liée" viatypeset ).

(Notez que non :est nécessaire / voulu comme séparateur .)

Tidbits connexes

Traiter de pathcette façon (comme un tableau) signifie aussi: pas besoin de faire un rehash pour obtenir les commandes nouvellement acheminées à trouver.

Jetez également un œil à vared pathune manière dynamique de modifierpath et d'autres choses.

Vous n'êtes peut-être intéressé que pathpar cette question, mais puisque nous parlons d'exportations et de tableaux, notez que les tableaux ne peuvent généralement pas être exportés.

Vous pouvez même empêcher PATHde prendre des entrées en double (reportez-vous à ceci et à cela ):

typeset -U path
Micah Elliott
la source
Ne devrait-il pas être «chemin + =: / toto / bar»? (avec un deux-points)
andrew lorien
1
@andrewlorien J'ai mis à jour la réponse avec des détails sur le séparateur de deux points.
Micah Elliott
Notez que s'il y a un commentaire après le chemin, nous avons besoin de guillemets, comme path+='my/path' # for fun. C'est évident si vous avez des espaces, mais pas tellement si vous avez des commentaires.
Franklin Yu
"(Notez que non: est nécessaire / voulu comme séparateur.)" Ceci n'est vrai que pour les minuscules path. Un précédent :est requis pour PATH, comme suit dans .zshrc PATH+=:/Users/path/to/my/folder
Emmett R.
37

une doublure, sans ouvrir le ~/.zshrcfichier

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

ou

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

Pour voir l'effet, faites source ~/.zshrcdans le même onglet ou ouvrez un nouvel onglet

Siva Praveen
la source
1
Fonctionne parfaitement sur OSX avec le shell Zsh.
Stryker
1
A travaillé comme un charme!
Akbar Sha Ebrahim
14
  1. Ajout du chemin vers ~ / .zshrc

    sudo vi ~/.zshrc

    ajouter un nouveau chemin

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. Mettre à jour ~ / .zshrc

    Enregistrer ~ / .zshrc

    source ~/.zshrc

  3. Vérifier CHEMIN

    echo $PATH

saneryee
la source
2
C'est le Bashchemin.
CousinCocaine
13

OPTION 1: Ajoutez cette ligne à ~ / .zshrc:

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

Après cela, vous devez courir source ~/.zshrc pour que vos modifications prennent effet OU fermer cette fenêtre et en ouvrir une nouvelle

OPTION 2: exécutez-le dans la console du terminal pour ajouter ce chemin uniquement à la session courante de la fenêtre du terminal. Lorsque vous fermez la fenêtre / session, elle sera perdue.

Dimitar
la source
Pouvez-vous expliquer en quoi cette réponse est différente de la même réponse publiée il y a 5 ans ?
Franklin Yu
dans cette réponse, il n'est pas dit que vous devez ajouter cette ligne de code au fichier, si vous l'exécutez simplement comme ça, cela ne changera que dans les fenêtres actuelles et cela n'est pas expliqué dans la réponse originale
Dimitar