Existe-t-il un moyen d'ajouter un répertoire à mon PATH dans zsh uniquement s'il n'est pas déjà présent?

15

Existe-t-il un moyen simple dans zsh d'ajouter un répertoire à mon PATH uniquement s'il n'est pas déjà présent? (ou, plus généralement, toute variable d'environnement). J'ai essayé:

PATH+=/my/directory

... mais si cela est exécuté deux fois, il est ajouté deux fois.

Andrew Ferrier
la source
2
@uther, ce n'est pas un doublon puisque cette autre question était pour bash, alors que celle-ci est pour zsh qui a sa propre façon de résoudre ce problème.
Stéphane Chazelas

Réponses:

32

In zsh $PATHest lié (voir typeset -T) au $pathtableau. Vous pouvez forcer ce tableau à avoir des valeurs uniques avec:

typeset -U path

Et puis, ajoutez le chemin avec:

path+=(~/foo)

Sans avoir à s'inquiéter s'il était déjà là.

Pour l'ajouter à l'avant, faites:

path=(~/foo "$path[@]")

ou:

path[1,0]=~/foo

si ~/fooétait déjà $pathdedans, cela le déplacera vers l'avant.

Stéphane Chazelas
la source
Tu ne veux pas dire typeset -Ug path? Lorsque j'utilise typeset -U pathdans mon ~/.zshrcfichier, je reçois toujours une erreur indiquant que rien ne se trouve dans le chemin pendant que zshrc est en cours d'exécution
kalbasit
@eMxyzptlk, étrange. -gest d'éviter de restreindre la portée, mais dans ~/.zshrc, la portée est déjà globale. Aussi, je n'ai jamais vu se zshplaindre d'un vide $PATH(sauf pour la commande des erreurs non trouvées bien sûr).
Stéphane Chazelas
3

Ajoutez export -U PATH=~/foo${PATH:+:$PATH}à l'un de vos fichiers de démarrage. Le -Uconserve uniquement la première occurrence d'une valeur dans des tableaux ou certaines :variables délimitées comme PATH.

llua
la source
-3

Vous devrez faire quelque chose comme:

if echo $PATH | grep :newpath: ; then doIfPresent; else doIfMissing; fi

Cela ne fonctionne que si newpathest délimité par deux ':', il faut considérer les cas quand il est au début ou à la fin de manière similaire.

Urgh.

vonbrand
la source
1
Vous pouvez le faire à l'intérieur du shell, avec uniquement des fonctionnalités Bourne / POSIX. Cela évite de citer des maux de tête (faites au moins cela echo "$PATH": mettez toujours des guillemets doubles autour des substitutions de variables ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles 'SO- arrête d'être méchant'