Есть ли способ добавить каталог в мой путь в zsh, только если он еще не существует?
15
Есть ли в zsh простой способ добавить каталог в мой путь, только если его еще нет? (или, в более общем случае, любая переменная окружения). Я пробовал:
PATH+=/my/directory
... но если он выполняется дважды, он добавляется дважды.
@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.
if echo $PATH | grep :newpath:;then doIfPresent;else doIfMissing;fi
Это работает только в том случае, если newpathразграничены двумя ':', необходимо учитывать случаи, когда оно находится в начале или в конце аналогично.
Вы можете сделать это внутри оболочки, используя только функции Bourne / POSIX. Это позволяет избежать головной боли при цитировании (по крайней мере, сделайте так echo "$PATH": всегда ставьте двойные кавычки вокруг переменных ). case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac
Ответы:
In
zsh
$PATH
привязан (см.typeset -T
) К$path
массиву. Вы можете заставить этот массив иметь уникальные значения с помощью:А затем добавьте путь с помощью:
Не нужно беспокоиться, если он уже был там.
Чтобы добавить его в начало, сделайте:
или:
если
~/foo
был уже в$path
том, переместит его на фронт.источник
typeset -Ug path
? Когда я используюtypeset -U path
в своем~/.zshrc
файле, я всегда получаю сообщение об ошибке, когда во время работы zshrc ничего не находится в пути-g
заключается в том, чтобы избежать ограничения области, но в~/.zshrc
области уже глобально. Кроме того, я никогда не виделzsh
жалобы на пустоту$PATH
(за исключением, конечно, ошибки команды не найдены).Добавьте
export -U PATH=~/foo${PATH:+:$PATH}
в один из ваших файлов запуска.-U
Сохраняет только первое вхождение значения в массивах или определенных:
разделители переменных как PATH.источник
Вы должны будете сделать что-то вроде:
Это работает только в том случае, если
newpath
разграничены двумя ':', необходимо учитывать случаи, когда оно находится в начале или в конце аналогично.Urgh.
источник
echo "$PATH"
: всегда ставьте двойные кавычки вокруг переменных ).case ":$PATH:" in *:/new/directory:*) :;; *) PATH=$PATH:/new/directory;; esac