Warum ist mein $PATH im ausgeführten Skript anders?

Warum ist mein $PATH im ausgeführten Skript anders?

echo $PATH im Gnome-Terminal:

/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/mp i/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/Programmierung/Software/tup:/home/pc/Programmierung/Bibliotheken/depottools:/home/pc/Programmierung/Bibliotheken/apache-maven-3.0.4/bin

Aus diesem Skript:

#!/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

Wie Sie sehen, habe ich meine .zshrcDatei wie folgt geändert:

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

Warum funktioniert es im Skript nicht, wenn es als Datei ausgeführt wird? Das Problem liegt darin, dass der Befehl lessc nicht gefunden wird.

Antwort1

Das Skript wird mit ausgeführt /bin/zsh, das keine interaktive oder Login-Shell ist und diese Datei nicht lädt. Von man zsh, Hervorhebung von mir:

Befehle werden zuerst aus /etc/zshenv gelesen; dies kann nicht überschrieben werden. Das nachfolgende Verhalten wird durch die Optionen RCS und GLOBAL_RCS geändert; die erste betrifft alle Startdateien, während die zweite nur globale Startdateien betrifft (die hier mit einem Pfad angezeigt werden, der mit / beginnt). Wenn eine der Optionen zu irgendeinem Zeitpunkt nicht gesetzt ist, werden nachfolgende Startdateien des entsprechenden Typs nicht gelesen. Es ist auch möglich, dass eine Datei in $ZDOTDIR GLOBAL_RCS wieder aktiviert. Sowohl RCS als auch GLOBAL_RCS sind standardmäßig gesetzt.

Befehle werden dann aus $ZDOTDIR/.zshenv gelesen. Wenn es sich bei der Shell um eine Login-Shell handelt, werden Befehle aus /etc/zprofile und dann aus $ZDOTDIR/.zprofile gelesen. Wenn die Shell interaktiv ist, werden Befehle aus /etc/zshrc und dann aus $ZDOTDIR/.zshrc gelesen.. Wenn es sich bei der Shell um eine Login-Shell handelt, werden abschließend /etc/zlogin und $ZDOTDIR/.zlogin gelesen.

Das Skript erbt die Umgebung, von der es aufgerufen wird, und wenn dies keine andere (interaktive) Shell ist, enthält es nicht die von Ihnen festgelegten Einstellungen .zshrc.

Sie können festlegen, PATHwo es global gilt (z. B. /etc/zshenv), es explizit direkt im Skript festlegen oder den Shebang-Skript-Header so ändern, dass es /bin/zsh -istattdessen ausgeführt wird, wodurch es geladen wird .zshrc(Zitat man zsh:Erzwingt interaktive Shell-Arbeit. Es ist weiterhin möglich, ein auszuführendes Skript anzugeben.).

Alternativ können Sie einfach den vollständigen Pfad zu dem Programm angeben, das nicht auf der Standardeinstellung steht PATH, z. B. /home/pc/less.js/bin/lessc.

Antwort2

zsh-Startdateien (auch bekannt als rc-Dateien)

Einem darunter liegenden Dateinamen, der kein vollständiger Pfad ist, wird implizit „$ZDOTDIR/“ vorangestellt. Dabei handelt es sich normalerweise um Ihr Home-Verzeichnis.

Die Reihenfolge, in der zsh Startskriptdateien bezieht, ist wie folgt.

/etc/zshenv– Zunächst werden die Befehle von hier ausgelesen, Optionen können dies nicht überschreiben.

.zshenv

/etc/zprofile– Login-Shell

.zprofile– Login-Shell

/etc/zshrc– interaktive Shell

.zshrc– interaktive Shell

/etc/zlogin– Login-Shell

.zlogin– Login-Shell

Zwei zsh-Optionen beeinflussen, ob zsh bestimmte der oben genannten Dateien als Quelle verwendet. („RCS“ ist der Plural von „rc“ und wird in Großbuchstaben wiedergegeben.)

Die zsh-Optionen RCS und GLOBAL_RCS sind standardmäßig festgelegt.

  • RCS – betrifft alle Startdateien
  • GLOBAL_RCS – betrifft nur globale Startdateien (Pfadnamen beginnend mit „/“)

Wenn eine Startdatei eine dieser Optionen aufhebt, überspringt zsh nachfolgende Startdateien dieses Typs.

Wenn eine Startdatei die Option GLOBAL_RCS festlegt, bezieht zsh nachfolgende globale Startdateien.

verwandte Informationen