Asignar $pwd a la variable $PATH condicionalmente

Asignar $pwd a la variable $PATH condicionalmente

Quiero agregar mi directorio de trabajo actual con sus bindirectorios específicos del proyecto a mi $PATH cuando los directorios estén presentes.

Entonces agregué estas líneas a mi.zshrc:

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

Las rutas superiores se anteponen cuando pego manualmente los comandos en la terminal, pero de lo contrario no lo hacen. Es $PATHlo mismo que antes. También probé diferentes formas de escribirlo como "${PATH}"y la función zsh path. Todos funcionan cuando se pegan manualmente, pero no cuando están dentro del.zshrcarchivo.

--

Estoy enmacOS High Sierra v10.13.6con elterminal predeterminaday usandozsh v5.7.1.

Respuesta1

Concretamente zsh, podrías hacer:

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

Dónde:

path[1,0]=( list )

inserta listal comienzo de la matriz ( $pathin zshes una matriz vinculada a $PATHme gusta en csh).

y (N/)es un calificador global donde Nhabilita nullglobel glob y /selecciona archivos de tipo directorio, por lo que agrega esos dos archivos antes de $PATHproporcionar que existan y sean de tipo.directorio.

pwdes el comando que imprime el directorio de trabajo pactual (el contenido de la variable), solo tendría sentido usarlo , o más bien en su si desea agregar directorios condicionalmente desde donde se comienza. Pero incluso entonces, eso sería peligroso, ya que, por ejemplo, si comenzó desde el directorio de otra persona, alguien podría haber colocado allí archivos maliciosos que anulan comandos estándar como o .wd$PWD$(pwd)$PWD.zshrc$PATHzshzsh/tmplsrm

Respuesta2

No creo que sea posible hacerlo como quieres, no con .rc (.rc se ejecuta solo una vez, no se ejecutará más tarde a menos que lo hagas específicamente). Pero ¿qué pasa con dos alias?

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"

Con eso puedes agregar tu directorio actual a $PATH en cualquier momento.

Respuesta3

Como otros han señalado, su código no necesariamente funciona como espera cuando abre una nueva terminal, ya que el directorio de trabajo actual puede no ser el que contiene sus proyectos, y ese fragmento de código essoloejecutar cuando se inicia un nuevo shell.

En cambio, probablemente sepa dónde están sus proyectos, posiblemente en relación con su $HOMEdirectorio. Si es así, puedes usar eso en su lugar:

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

export PATH

Aquí, supongo que ahí $HOME/projectses donde están tus proyectos.

Probablemente el exportfinal no sea necesario porque PATHprobablemente ya se haya exportado.

información relacionada