Я хочу добавить свой текущий рабочий каталог с его bin
каталогами, специфичными для проекта, в $PATH, если эти каталоги присутствуют.
Поэтому я добавил эти строки в свой.zshrc:
[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"
Верхние пути добавляются, когда я вручную вставляю команды в терминал, но в противном случае они не добавляются. Это $PATH
то же самое, что и раньше. Я также пробовал разные способы записать это, как "${PATH}"
и функция zsh path
. Они все работают, когда вставляются вручную, но не когда внутри.zshrcфайл.
--
Я наmacOs High Sierra v10.13.6сТерминал по умолчаниюи использованиеzshv5.7.1.
решение1
В zsh
частности, вы могли бы сделать:
path[1,0]=( ~/projects/{vendor/,node_modules/.}bin(/N) )
Где:
path[1,0]=( list )
вставляет list
в начало массива ( $path
in zsh
— это массив, привязанный к $PATH
in csh
).
и (N/)
является квалификатором глобуса, который N
включает nullglob
глобус и /
выбирает файлы типа каталог, поэтому он добавляет эти два файла вперед, $PATH
если они существуют и имеют типкаталог.
pwd
это команда, которая p
rints текущий w
orking d
irectory (содержимое переменной $PWD
), то имело бы смысл использовать $(pwd)
, или скорее $PWD
в вашем , .zshrc
если бы вы хотели добавить каталоги в $PATH
условно к тому, откуда zsh
начинается. Но даже в этом случае это было бы опасно, например, если бы вы начали zsh
с /tmp
или чьего-то другого каталога, кто-то мог бы внедрить туда вредоносные файлы, которые переопределяют стандартные команды, такие как ls
или rm
.
решение2
Я не думаю, что это возможно сделать так, как вы хотите, не с .rc (.rc выполняется только один раз, он не будет выполняться позже, если вы специально не сделаете этого). Но как насчет двух псевдонимов?
backupPATH=$PATH
function mkpath {
[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"
}
alias resetpath="PATH=$backupPATH"
Благодаря этому вы можете в любое время добавить свой текущий каталог в $PATH.
решение3
Как уже отмечалось, ваш код не обязательно будет работать так, как вы ожидаете, когда вы открываете новый терминал, поскольку текущий рабочий каталог может не совпадать с тем, в котором содержатся ваши проекты, а этот фрагмент кодатолькозапускается при запуске новой оболочки.
Вместо этого вы, вероятно, знаете, где находятся ваши проекты, возможно, по отношению к вашему $HOME
каталогу. Если так, вы можете использовать это вместо этого:
for binpath in vendor/bin node_modules/.bin; do
if [ -d "$HOME/projects/$binpath" ]; then
PATH=$HOME/projects/$binpath:$PATH
fi
done
export PATH
Я предполагаю, что $HOME/projects
именно там находятся ваши проекты.
В export
конце, вероятно, нет необходимости, так как PATH
он, скорее всего, уже экспортирован.