Atribuir $pwd à variável $PATH condicionalmente

Atribuir $pwd à variável $PATH condicionalmente

Quero adicionar meu diretório de trabalho atual com seus bindiretórios específicos do projeto ao meu $PATH quando os diretórios estiverem presentes.

Então eu adicionei essas linhas ao meu.zshrc:

[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"

Os caminhos superiores são acrescentados quando colo manualmente os comandos no terminal, mas, caso contrário, não são. O $PATHé o mesmo de antes. Também tentei diferentes maneiras de escrever como "${PATH}"a função zsh path. Todos eles funcionam quando colados manualmente, mas não quando dentro do.zshrcarquivo.

--

Estou dentromacOS High Sierra v10.13.6com oTerminal padrãoe usandozsh v5.7.1.

Responder1

Especificamente zsh, você poderia fazer:

path[1,0]=( ~/projects/{vendor/,node_modules/.}bin(/N) )

Onde:

path[1,0]=( list )

insere the listno início do array ( $pathin zshé um array vinculado a $PATHlike in csh).

e (N/)é um qualificador glob onde Nhabilita nullglobo glob e /seleciona arquivos do tipo diretório, então ele adiciona esses dois arquivos antes de $PATHfornecer que eles existam e sejam do tipodiretório.

pwdé o comando que copia o diretório de trabalho patual (o conteúdo da variável), só faria sentido usar , ou melhor, no seu, se você quisesse adicionar diretórios condicionalmente ao local de onde foi iniciado. Mas mesmo assim, isso seria perigoso, como, por exemplo, se você iniciasse a partir do diretório de outra pessoa, alguém poderia ter plantado arquivos maliciosos lá que substituem comandos padrão como ou .wd$PWD$(pwd)$PWD.zshrc$PATHzshzsh/tmplsrm

Responder2

não acho que seja possível fazer como você deseja, não com .rc (.rc é executado apenas uma vez, não será executado posteriormente, a menos que você o faça especificamente). Mas e quanto a dois apelidos?

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"

Com isso você pode adicionar seu diretório atual ao $PATH a qualquer momento.

Responder3

Como outros apontaram, seu código não funciona necessariamente como você espera quando você abre um novo terminal, pois o diretório de trabalho atual pode não ser aquele que contém seus projetos, e esse trecho de código éapenasexecutado quando um novo shell é iniciado.

Em vez disso, você provavelmente sabe onde estão seus projetos, possivelmente em relação ao seu $HOMEdiretório. Nesse caso, você pode usar isso:

for binpath in vendor/bin node_modules/.bin; do
    if [ -d "$HOME/projects/$binpath" ]; then
        PATH=$HOME/projects/$binpath:$PATH
    fi
done

export PATH

Aqui, presumo que $HOME/projectsé onde estão seus projetos.

O exportfinal provavelmente não é necessário, pois PATHprovavelmente já foi exportado.

informação relacionada