実行されたスクリプトで $PATH が異なるのはなぜですか?

実行されたスクリプトで $PATH が異なるのはなぜですか?

gnomeターミナル内で$PATHをechoします:

/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/Libraries/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/games:/usr/lib64/jvm/jre/bin

ご覧のとおり、私は.zshrc次のようにファイルを変更しました。

PATH=/home/pc/less.js/bin:$PATH をエクスポートします。

ファイルとして実行するとスクリプト内で動作しないのはなぜでしょうか? 問題は lessc コマンドが見つからないことです。

答え1

スクリプトは を使用して実行されますが/bin/zsh、これは対話型シェルでもログイン シェルでもないため、このファイルをロードしません。 より引用man zsh、強調は筆者によるものです:

コマンドは最初に /etc/zshenv から読み込まれます。これは上書きできません。その後の動作は RCS および GLOBAL_RCS オプションによって変更されます。前者はすべてのスタートアップ ファイルに影響しますが、後者はグローバル スタートアップ ファイル (ここではパスが / で始まるもの) にのみ影響します。いずれかのオプションがいずれかの時点で設定されていない場合、対応するタイプの後続のスタートアップ ファイルは読み込まれません。$ZDOTDIR のファイルで GLOBAL_RCS を再度有効にすることもできます。RCS と GLOBAL_RCS は両方ともデフォルトで設定されています。

コマンドは $ZDOTDIR/.zshenv から読み取られます。 シェルがログイン シェルの場合、コマンドは /etc/zprofile から読み込まれ、次に $ZDOTDIR/.zprofile から読み込まれます。シェルが対話型の場合、コマンドは /etc/zshrc から読み込まれ、次に $ZDOTDIR/.zshrc から読み込まれます。最後に、シェルがログイン シェルの場合は、/etc/zlogin と $ZDOTDIR/.zlogin が読み取られます。

スクリプトは呼び出された場所から環境を継承します。これが別の (対話型) シェルでない場合は、 で設定した設定は含まれません.zshrc

PATHをグローバルに適用する場所(例/etc/zshenv)に設定したり、スクリプト内で直接明示的に設定したり、/bin/zsh -i代わりにshebang スクリプト ヘッダーを実行してロードするように変更したりできます.zshrc( を引用man zshシェルを強制的に対話型にします。実行するスクリプトを指定することも可能です。)。

あるいは、デフォルトでないプログラムへのフルパスを指定しますPATH(例: ) /home/pc/less.js/bin/lessc

答え2

zsh 起動ファイル (別名 rc ファイル)

フルパスではない以下のファイル名の前には、暗黙的に「$ZDOTDIR/」が付きます。これは通常、ホーム ディレクトリです。

zsh が起動スクリプト ファイルを取得する順序は次のとおりです。

/etc/zshenv– まず、ここからコマンドが読み取られます。オプションでこれを上書きすることはできません。

.zshenv

/etc/zプロファイル– ログインシェル

.zプロファイル– ログインシェル

/etc/zshrc– インタラクティブシェル

.zshrc– インタラクティブシェル

/etc/zlogin– ログインシェル

.zログイン– ログインシェル

2 つの zsh オプションは、zsh が上記のファイルのうち特定のファイルを取得するかどうかに影響します (「RCS」は「rc」の複数形で、大文字で表示されます)。

RCS および GLOBAL_RCS zsh オプションはデフォルトで設定されています。

  • RCS – すべての起動ファイルに影響します
  • GLOBAL_RCS – グローバルスタートアップファイル(パス名が「/」で始まる)のみに影響します。

起動ファイルでこれらのオプションのいずれかが設定されていない場合、zsh はそのタイプの後続の起動ファイルをスキップします。

起動ファイルで GLOBAL_RCS オプションが設定されている場合、zsh は後続のグローバル起動ファイルをソースとして使用します。

関連情報