Есть ли способ добавить каталог в мой путь в zsh, только если он еще не существует?

15

Есть ли в zsh простой способ добавить каталог в мой путь, только если его еще нет? (или, в более общем случае, любая переменная окружения). Я пробовал:

PATH+=/my/directory

... но если он выполняется дважды, он добавляется дважды.

Эндрю Ферье
источник
2
@uther, это не дубликат, поскольку этот другой вопрос был для bash, а этот вопрос для zsh, у которого есть свой собственный способ решения этой проблемы.
Стефан Шазелас

Ответы:

32

In zsh $PATHпривязан (см. typeset -T) К $pathмассиву. Вы можете заставить этот массив иметь уникальные значения с помощью:

typeset -U path

А затем добавьте путь с помощью:

path+=(~/foo)

Не нужно беспокоиться, если он уже был там.

Чтобы добавить его в начало, сделайте:

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

или:

path[1,0]=~/foo

если ~/fooбыл уже в $pathтом, переместит его на фронт.

Стефан Шазелас
источник
Ты имеешь в виду typeset -Ug path? Когда я использую typeset -U pathв своем ~/.zshrcфайле, я всегда получаю сообщение об ошибке, когда во время работы zshrc ничего не находится в пути
kalbasit
@eMxyzptlk, странно. -gзаключается в том, чтобы избежать ограничения области, но в ~/.zshrcобласти уже глобально. Кроме того, я никогда не видел zshжалобы на пустоту $PATH(за исключением, конечно, ошибки команды не найдены).
Стефан Шазелас
3

Добавьте export -U PATH=~/foo${PATH:+:$PATH}в один из ваших файлов запуска. -UСохраняет только первое вхождение значения в массивах или определенных :разделители переменных как PATH.

llua
источник
-3

Вы должны будете сделать что-то вроде:

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

Это работает только в том случае, если newpathразграничены двумя ':', необходимо учитывать случаи, когда оно находится в начале или в конце аналогично.

Urgh.

vonbrand
источник
1
Вы можете сделать это внутри оболочки, используя только функции Bourne / POSIX. Это позволяет избежать головной боли при цитировании (по крайней мере, сделайте так echo "$PATH": всегда ставьте двойные кавычки вокруг переменных ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Жиль "ТАК ... перестать быть злым"