Pourquoi mon $ PATH est-il différent dans le script exécuté?

4

echo $ PATH à l'intérieur du 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 / Programmation / Logiciels / tup: / home / pc / Programmation / Bibliothèques / dépôts d'outils: /home/pc/Programming/Libraries/apache-maven-3.0.4/bin

De l'intérieur de ce 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 / games: / usr / lib64 / jvm / jre / bin

Comme vous pouvez le constater, j'ai modifié mon .zshrcfichier avec ceci:

export PATH = / home / pc / less.js / bin: $ PATH

Pourquoi cela ne fonctionne-t-il pas dans le script lorsqu'il est exécuté en tant que fichier? Le problème est que la commande lessc n'a pas été trouvée.

Blub
la source

Réponses:

5

Le script est exécuté en utilisant /bin/zsh, qui n'est pas un shell interactif ou de connexion et ne charge pas ce fichier. De man zsh, souligne le mien:

Les commandes sont d'abord lues depuis / etc / zshenv; cela ne peut pas être annulé. Le comportement ultérieur est modifié par les options RCS et GLOBAL_RCS. le premier affecte tous les fichiers de démarrage, tandis que le second affecte uniquement les fichiers de démarrage globaux (ceux montrés ici avec un chemin commençant par un /). Si l'une des options est désactivée à un moment quelconque, aucun fichier de démarrage ultérieur du type correspondant ne sera lu. Il est également possible pour un fichier dans $ ZDOTDIR de réactiver GLOBAL_RCS. RCS et GLOBAL_RCS sont définis par défaut.

Les commandes sont ensuite lues à partir de $ ZDOTDIR / .zshenv. Si le shell est un shell de connexion, les commandes sont lues à partir de / etc / zprofile, puis de $ ZDOTDIR / .zprofile. Ensuite, si le shell est interactif, les commandes sont lues dans / etc / zshrc, puis dans $ ZDOTDIR / .zshrc . Enfin, si le shell est un shell de connexion, les fichiers / etc / zlogin et $ ZDOTDIR / .zlogin sont lus.

Le script hérite de l'environnement d'où il est appelé, et s'il ne s'agit pas d'un autre shell (interactif), il ne contiendra pas les préférences que vous avez définies .zshrc.

Vous pouvez définir l' PATHendroit où il s'applique globalement (par exemple /etc/zshenv), le définir explicitement directement dans le script ou modifier l'en-tête de script shebang pour qu'il s'exécute /bin/zsh -i, ce qui le chargera .zshrc(citation man zsh: Forcer le shell à être interactif. Il est toujours possible de spécifier un script. exécuter. )

Autrement, spécifiez simplement le chemin complet du programme qui n'est pas celui par défaut PATH, par exemple /home/pc/less.js/bin/lessc.

Daniel Beck
la source
1

fichiers de démarrage zsh (fichiers rc)

Un nom de fichier ci-dessous qui n'est pas un chemin complet est implicitement précédé de «$ ZDOTDIR /», qui est généralement votre répertoire de base.

L'ordre dans lequel les fichiers de script de démarrage sont générés par zsh est le suivant.

/ etc / zshenv - D'abord, les commandes sont lues à partir d'ici; les options ne peuvent pas être ignorées.

.zshenv

/ etc / zprofile - shell de connexion

.zprofile - shell de connexion

/ etc / zshrc - shell interactif

.zshrc - shell interactif

/ etc / zlogin - shell de connexion

.zlogin - shell de connexion

Deux options zsh déterminent si zsh source certains des fichiers ci-dessus. («RCS» est le pluriel de «rc», en majuscule.)

Les options RCS et GLOBAL_RCS zsh sont définies par défaut.

  • RCS - affecte tous les fichiers de démarrage
  • GLOBAL_RCS - affecte uniquement les fichiers de démarrage globaux (noms de chemins commençant par “/”)

Si un fichier de démarrage désactive l'une de ces options, zsh ignore les fichiers de démarrage suivants de ce type.

Si un fichier de démarrage définit l'option GLOBAL_RCS, zsh génère les fichiers de démarrage globaux suivants.

daveyost
la source