¿Por qué mi $PATH es diferente en el script ejecutado?

¿Por qué mi $PATH es diferente en el script ejecutado?

echo $PATH dentro de la terminal gnome:

/home/pc/less.js/bin:/home/pc/local/bin:/home/pc/local/bin:/home/pc/.rvm/gems/ruby-1.9.2-head/bin:/ home/pc/.rvm/gems/ruby-1.9.2-head@global/bin:/home/pc/.rvm/rubies/ruby-1.9.2-head/bin:/home/pc/.rvm/bin :/usr/local/bin:/home/pc/local/bin:/usr/lib64/mpi/gcc/openmpi/bin:/home/pc/bin:/usr/local/bin:/usr/bin:/ bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/home/pc/Programación/Software/tup:/home/pc/Programación/ Bibliotecas/depottools:/home/pc/Programming/Libraries/apache-maven-3.0.4/bin

Desde dentro de este script:

#!/bin/zsh
echo $PATH
while inotifywait -e modify /home/pc/vbox-shared/less; do
    lessc custom.less > /home/pc/vbox-shared/less/custom.css
done

/usr/lib64/mpi/gcc/openmpi/bin:/home/pc/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/ usr/juegos:/usr/lib64/jvm/jre/bin

Como puede ver, modifiqué mi .zshrcarchivo con esto:

exportar RUTA=/home/pc/less.js/bin:$RUTA

¿Por qué no funciona en el script cuando se ejecuta como archivo? El problema es que no se encuentra el comando lessc.

Respuesta1

El script se ejecuta mediante /bin/zsh, que no es un shell interactivo ni de inicio de sesión y no carga este archivo. De man zsh, énfasis mío:

Los comandos se leen primero desde /etc/zshenv; esto no se puede anular. El comportamiento posterior se modifica mediante las opciones RCS y GLOBAL_RCS; el primero afecta a todos los archivos de inicio, mientras que el segundo solo afecta a los archivos de inicio globales (los que se muestran aquí con una ruta que comienza con /). Si una de las opciones no está configurada en algún momento, no se leerán los archivos de inicio posteriores del tipo correspondiente. También es posible que un archivo en $ZDOTDIR vuelva a habilitar GLOBAL_RCS. Tanto RCS como GLOBAL_RCS están configurados de forma predeterminada.

Luego, los comandos se leen desde $ZDOTDIR/.zshenv. Si el shell es un shell de inicio de sesión, los comandos se leen desde /etc/zprofile y luego desde $ZDOTDIR/.zprofile. Luego, si el shell es interactivo, los comandos se leen desde /etc/zshrc y luego desde $ZDOTDIR/.zshrc.. Finalmente, si el shell es un shell de inicio de sesión, se leen /etc/zlogin y $ZDOTDIR/.zlogin.

El script hereda el entorno desde donde se llama y, si este no es otro shell (interactivo), no contendrá las preferencias que establezca .zshrc.

Puede configurar PATHdónde se aplica globalmente (por ejemplo /etc/zshenv), configurarlo explícitamente en el script directamente o cambiar el encabezado del script shebang para que se ejecute /bin/zsh -ien su lugar, haciendo que se cargue .zshrc(citando man zsh:Forzar que Shell sea interactivo. Todavía es posible especificar un script para ejecutar.).

Alternativamente, simplemente especifique la ruta completa al programa que no esté en el valor predeterminado PATH, por ejemplo /home/pc/less.js/bin/lessc.

Respuesta2

Archivos de inicio zsh (también conocidos como archivos rc)

Un nombre de archivo a continuación que no sea una ruta completa está precedido implícitamente por “$ZDOTDIR/”, que suele ser su directorio de inicio.

El orden en el que zsh genera los archivos de script de inicio es el siguiente.

/etc/zshenv– Primero, los comandos se leen desde aquí; Las opciones no se pueden anular esto.

.zshenv

/etc/zperfil– shell de inicio de sesión

.zperfil– shell de inicio de sesión

/etc/zshrc– caparazón interactivo

.zshrc– caparazón interactivo

/etc/zlogin– shell de inicio de sesión

.zlogin– shell de inicio de sesión

Dos opciones de zsh afectan si zsh obtiene ciertos de los archivos anteriores. (“RCS” es el plural de “rc”, traducido en mayúsculas).

Las opciones RCS y GLOBAL_RCS zsh están configuradas de forma predeterminada.

  • RCS: afecta a todos los archivos de inicio
  • GLOBAL_RCS: afecta solo a archivos de inicio globales (nombres de ruta que comienzan con “/”)

Si un archivo de inicio desactiva una de estas opciones, zsh omite los archivos de inicio posteriores de ese tipo.

Si un archivo de inicio establece la opción GLOBAL_RCS, zsh genera archivos de inicio globales posteriores.

información relacionada