Условно присвоить $pwd переменной $PATH

Условно присвоить $pwd переменной $PATH

Я хочу добавить свой текущий рабочий каталог с его 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в начало массива ( $pathin zsh— это массив, привязанный к $PATHin csh).

и (N/)является квалификатором глобуса, который Nвключает nullglobглобус и /выбирает файлы типа каталог, поэтому он добавляет эти два файла вперед, $PATHесли они существуют и имеют типкаталог.

pwdэто команда, которая prints текущий working directory (содержимое переменной $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он, скорее всего, уже экспортирован.

Связанный контент