Czy istnieje sposób, aby dodać katalog do mojej ŚCIEŻKI w Zsh tylko wtedy, gdy nie jest już obecny?

15

Czy istnieje prosty sposób, aby w Zsh dodać katalog do mojej ŚCIEŻKI tylko wtedy, gdy nie jest już obecny? (lub, bardziej ogólnie, dowolna zmienna środowiskowa). Próbowałem:

PATH+=/my/directory

... ale jeśli zostanie to wykonane dwukrotnie, zostanie dodane dwukrotnie.

Andrew Ferrier
źródło
2
@ inne, to nie jest duplikat, ponieważ to drugie pytanie dotyczyło bash, podczas gdy to dotyczy zsh, który ma swój własny sposób na rozwiązanie tego problemu.
Stéphane Chazelas,

Odpowiedzi:

32

In zsh $PATHjest powiązany (patrz typeset -T) z $pathtablicą. Możesz wymusić na tej tablicy unikalne wartości za pomocą:

typeset -U path

A następnie dodaj ścieżkę za pomocą:

path+=(~/foo)

Bez obaw, czy już tam był.

Aby dodać go z przodu, wykonaj:

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

lub:

path[1,0]=~/foo

jeśli ~/foobył już w $path, spowoduje przeniesienie go do przodu.

Stéphane Chazelas
źródło
Nie masz na myśli typeset -Ug path? Kiedy używam typeset -U pathw swoim ~/.zshrcpliku, zawsze pojawia się błąd, że nic nie jest na ścieżce, gdy zshrc jest uruchomiony
kalbasit
@eMxyzptlk, dziwne. -gma na celu uniknięcie ograniczenia zakresu, ale w ~/.zshrczasięgu jest już globalny. Ponadto, nigdy nie widziałem zshnarzekać na puste $PATH(oczywiście z wyjątkiem polecenia nie znaleziono błędów oczywiście).
Stéphane Chazelas
3

Dodaj export -U PATH=~/foo${PATH:+:$PATH}do jednego ze swoich plików startowych. -UZachowuje tylko pierwsze wystąpienie wartości w macierzy lub pewnych :zmiennych rozdzielany jak PATH.

llua
źródło
-3

Musisz zrobić coś takiego:

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

Działa to tylko wtedy, gdy newpathjest podzielone na dwa „:”, należy wziąć pod uwagę przypadki, gdy jest na początku lub na końcu podobnie.

Urgh.

vonbrand
źródło
1
Możesz to zrobić wewnątrz powłoki, tylko z funkcjami Bourne / POSIX. Pozwala to uniknąć cytowania problemów (przynajmniej sprawi, że echo "$PATH": zawsze umieszczaj podwójne cudzysłowy wokół podstawień zmiennych ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Gilles „SO- przestań być zły”