Quiero agregar mi directorio de trabajo actual con sus bin
directorios 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 $PATH
lo 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 list
al comienzo de la matriz ( $path
in zsh
es una matriz vinculada a $PATH
me gusta en csh
).
y (N/)
es un calificador global donde N
habilita nullglob
el glob y /
selecciona archivos de tipo directorio, por lo que agrega esos dos archivos antes de $PATH
proporcionar que existan y sean de tipo.directorio.
pwd
es el comando que imprime el directorio de trabajo p
actual (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 .w
d
$PWD
$(pwd)
$PWD
.zshrc
$PATH
zsh
zsh
/tmp
ls
rm
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 $HOME
directorio. 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/projects
es donde están tus proyectos.
Probablemente el export
final no sea necesario porque PATH
probablemente ya se haya exportado.