Perché il mio $ PATH è diverso nello script eseguito?

echo $ PATH all'interno del 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/[email protected]/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 / giochi: / usr / lib64 / JVM / jre / bin: / home / pc / Programmazione / Software / TUP: / home / pc / Programmazione / biblioteche / depottools: /home/pc/Programming/Libraries/apache-maven-3.0.4/bin

Dall'interno di questo 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 / giochi: / usr / lib64 / JVM / jre / bin

Come potete vedere, ho modificato il mio file .zshrc con questo:

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

Perché non funziona nello script quando viene eseguito come file? Il problema è che il command lessc non viene trovato.

Lo script viene eseguito usando /bin/zsh , che non è una shell intertriggers o di login e non carica questo file. man zsh , la mia enfasi:

I comandi vengono prima letti da / etc / zshenv; questo non può essere ignorato. Il comportmento successivo viene modificato dalle opzioni RCS e GLOBAL_RCS; il primo riguarda tutti i file di avvio, mentre il secondo riguarda solo i file di avvio globale (quelli mostrati qui con un path che inizia con un /). Se una delle opzioni è distriggersta in qualsiasi momento, i file di avvio successivi del tipo corrispondente non verranno letti. È anche ansible che un file in $ ZDOTDIR riabilisca GLOBAL_RCS. Sia RCS che GLOBAL_RCS sono impostati per impostazione predefinita.

I comandi vengono quindi letti da $ ZDOTDIR / .zshenv. Se la shell è una shell di login, i comandi vengono letti da / etc / zprofile e quindi da $ ZDOTDIR / .zprofile. Quindi, se la shell è intertriggers, i comandi vengono letti da / etc / zshrc e quindi da $ ZDOTDIR / .zshrc . Infine, se la shell è una shell di login, vengono letti / etc / zlogin e $ ZDOTDIR / .zlogin.

Lo script eredita l'ambiente da where è chiamato e se questo non è un'altra shell (intertriggers), esso non contiene le preferenze impostate in .zshrc .

È ansible impostare il PATH where si applica globalmente (es. /etc/zshenv ), impostarlo esplicitamente nello script direttamente o modificare l'intestazione di script shebang per eseguire invece /bin/zsh -i , facendolo caricare .zshrc (citando man zsh : Forza la shell per essere intertriggers. E 'ancora ansible specificare uno script da eseguire. ).

In alternativa, specificare il path completo al programma che non è sul PATH predefinito, ad esempio /home/pc/less.js/bin/lessc .

file di avvio zsh (file aka rc)

Un nome di file che non è un path completo è precedentemente implicitamente preceduto da "$ ZDOTDIR /", che è tipicamente la tua home directory.

L'ordine in cui i file di script di avvio di sorgenti zsh sono i seguenti.

/ etc / zshenv – In primo luogo, i comandi vengono letti da qui; le opzioni non possono essere ignorate.

.zshenv

/ etc / zprofile – shell di login

.zprofile – shell di login

/ etc / zshrc – shell interattivo

.zshrc – shell interattivo

/ etc / zlogin – shell di login

.zlogin – shell di login

Due opzioni zsh influenzano se le fonti zsh fanno parte dei file di cui sopra. ("RCS" è il plurale di "rc", reso in maiuscolo.)

Le opzioni zCS di RCS e GLOBAL_RCS sono impostate per impostazione predefinita.

  • RCS – riguarda tutti i file di avvio
  • GLOBAL_RCS – riguarda solo i file di avvio globale (i routes che iniziano con "/")

Se un file di avvio scatta una di queste opzioni, zsh salta i file di avvio successivi di quel tipo.

Se un file di avvio imposta l'opzione GLOBAL_RCS, i file di avvio globale di zsh provengono da fonti successive.