為什麼我的 $PATH 在執行的腳本中不同?

為什麼我的 $PATH 在執行的腳本中不同?

在 gnome 終端機內 echo $PATH:

/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/Programming/Software/tup:/home/pc /Programming/函式庫/depottools:/home/pc/Programming/Libraries/apache-maven-3.0.4/bin

從這個腳本內部:

#!/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/mp​​i/gcc/openmpi/bin:/home/pc/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/ bin:/ usr/遊戲:/usr/lib64/jvm/jre/bin

正如你所看到的,我修改了我的.zshrc文件:

導出 PATH=/home/pc/less.js/bin:$PATH

當作為文件執行時,為什麼它在腳本中不起作用?問題是未找到 lessc 指令。

答案1

該腳本使用 運行/bin/zsh,它不是互動式或登入 shell,並且不會載入此檔案。來自man zsh,強調我的:

首先從/etc/zshenv讀取命令;這不能被覆蓋。後續行為由 RCS 和 GLOBAL_RCS 選項修改;前者影響所有啟動文件,而第二個僅影響全域啟動文件(此處顯示的路徑以 / 開頭)。如果在任何時候未設定其中一個選項,則將不會讀取相應類型的任何後續啟動檔案。 $ZDOTDIR 中的檔案也可以重新啟用 GLOBAL_RCS。 RCS 和 GLOBAL_RCS 都是預設的。

然後從 $ZDOTDIR/.zshenv 讀取指令。 如果 shell 是登入 shell,則從 /etc/zprofile 讀取命令,然後從 $ZDOTDIR/.zprofile 讀取。然後,如果 shell 是互動的,則從 /etc/zshrc 讀取命令,然後從 $ZDOTDIR/.zshrc 讀取命令。最後,如果 shell 是登入 shell,則讀取 /etc/zlogin 和 $ZDOTDIR/.zlogin。

該腳本從呼叫它的地方繼承環境,如果這不是另一個(互動式)shell,它不會包含您在 中設定的首選項.zshrc

您可以設定PATH它全域應用的位置(例如/etc/zshenv),直接在腳本中明確設定它,或更改要執行的 shebang 腳本標頭/bin/zsh -i,使其載入.zshrc(引用man zsh強制 shell 進行互動。仍然可以指定要執行的腳本。)。

或者,只需指定預設程式之外的程式的完整路徑PATH,例如/home/pc/less.js/bin/lessc

答案2

zsh 啟動檔(又稱 rc 檔)

下面的非完整路徑的檔案名稱隱式地以“$ZDOTDIR/”開頭,這通常是您的主目錄。

zsh 取得啟動腳本檔案的順序如下。

/etc/zshenv– 首先,從這裡讀取命令;選項不能覆蓋它。

.zshenv

/etc/zprofile– 登入外殼

.z設定檔– 登入外殼

/etc/zshrc– 互動式外殼

.zshrc– 互動式外殼

/etc/zlogin– 登入外殼

.zlogin– 登入外殼

兩個 zsh 選項會影響 zsh 是否取得上述某些檔案的來源。 (“RCS”是“rc”的複數形式,以大寫形式呈現。)

RCS 和 GLOBAL_RCS zsh 選項是預設的。

  • RCS – 影響所有啟動文件
  • GLOBAL_RCS – 僅影響全域啟動檔案(以「/」開頭的路徑名稱)

如果啟動檔案取消設定這些選項之一,zsh 將跳過該類型的後續啟動檔案。

如果啟動檔案設定了 GLOBAL_RCS 選項,zsh 將取得後續的全域啟動檔案。

相關內容