Kann ich meinem PATH in zsh nur dann ein Verzeichnis hinzufügen, wenn es noch nicht vorhanden ist?

15

Gibt es in zsh eine einfache Möglichkeit, meinem PATH ein Verzeichnis hinzuzufügen, wenn es noch nicht vorhanden ist? (oder allgemeiner jede Umgebungsvariable). Ich habe es versucht:

PATH+=/my/directory

... aber wenn das zweimal ausgeführt wird, wird es zweimal hinzugefügt.

Andrew Ferrier
quelle
2
@uther, das ist kein Duplikat, da diese andere Frage für bash war, während diese für zsh ist, die ihre eigene Art hat, dieses Problem zu lösen.
Stéphane Chazelas

Antworten:

32

In zsh $PATHist an typeset -Tdas $pathArray gebunden (siehe ) . Sie können dieses Array zwingen, eindeutige Werte zu haben mit:

typeset -U path

Fügen Sie dann den Pfad hinzu mit:

path+=(~/foo)

Ohne sich sorgen zu müssen, wenn es schon da war.

Gehen Sie wie folgt vor, um es an der Vorderseite hinzuzufügen:

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

oder:

path[1,0]=~/foo

wenn ~/foodas schon $pathdrin war wird es nach vorne rücken.

Stéphane Chazelas
quelle
Meinst du nicht typeset -Ug path? Wenn ich typeset -U pathin meiner ~/.zshrcDatei verwende, erhalte ich immer eine Fehlermeldung, dass sich nichts im Pfad befindet, während der zshrc ausgeführt wird
kalbasit
@eMxyzptlk, komisch. -gsoll vermeiden, den Geltungsbereich einzuschränken, aber in ~/.zshrcist der Geltungsbereich bereits global. Außerdem habe ich noch nie zshBeschwerden über eine leere gesehen $PATH(außer dem Befehl keine Fehler gefunden natürlich).
Stéphane Chazelas
3

Fügen Sie export -U PATH=~/foo${PATH:+:$PATH}zu einer Ihrer Startdateien hinzu. Das -Uhält nur das erste Auftreten eines Wertes in Arrays oder bestimmten :getrennten Variablen wie PATH.

llua
quelle
-3

Sie müssen etwas tun wie:

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

Dies funktioniert nur, wenn newpathes durch zwei ':' abgegrenzt ist und die Fälle berücksichtigt werden müssen, in denen es am Anfang oder Ende ähnlich ist.

Urgh.

vonbrand
quelle
1
Sie können dies innerhalb der Shell nur mit Bourne / POSIX-Funktionen tun. Dies vermeidet das Zitieren von Kopfschmerzen (zumindest echo "$PATH": Setzen Sie Variablenersetzungen immer in doppelte Anführungszeichen ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles 'SO- hör auf böse zu sein'