web-dev-qa-db-ja.com

$ PATH環境変数が設定されている理由と場所を知る方法は?

OSXのiterm2でzsh 5.0.8バージョンを使用しています。

コンピューターを起動すると、printenv$PATH変数が表示されます。

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

私の理解では、zshは次のファイルを順番に読み込みます。

/etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc

チェックしたところ、最初の3つのファイルがなく、.zshrcは基本的に空で、$ PATH変数に関連するものは何もありません。

次に、$PATH変数セットはどこにありますか???

6
Aaron Shen

私は文字通りこれと今日戦いました。

OS Xでは、ヨセミテPATHはかなり回り道で構築されています。

Cremefraicheが言うように、ZSHには組み込みの$PATHがあり、他に何も設定されていない場合に使用されると思いますが、それはあなたのソースではありません。まず、ディレクトリのリストを含む/etc/pathsファイルがあります。また、ディレクトリを含むより多くのファイルを含む/etc/path.dというディレクトリもあります。プログラム/usr/libexec/path_helperは、これらのディレクトリのリストを取得し、それらを既存の$PATH変数(存在する場合)とマージし、重複を削除し、/etc/pathsディレクトリを最初にリストして結果を出力します。

自分で実行してみてください。害はありません。これが私の出力です:

$ /usr/libexec/path_helper 
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/alan/.local/bin:/Users/alan/src/go/bin"; export PATH;

それ自体は何もしませんが、私のマシンでは/etc/zprofileから呼び出されます。

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

Appleは、このコードをOS Xの異なるバージョンで少し動かしたようです。

all OS XでZSHが評価するファイルのリストを以下に示します。

  1. / etc/zshenv
  2. 〜/ .zshenv
  3. / etc/zprofile
  4. 〜/ .zprofile
  5. / etc/zshrc
  6. 〜/ .zshrc
  7. / etc/zlogin
  8. 〜/ .zlogin
  9. 〜/ .zlogout
  10. / etc/zlogout

これらのファイルの一部は、非インタラクティブシェルスクリプトとして実行する場合など、特定の状況では評価されませんが、ここでは説明しません。興味があればZSH manページにあります。

$ man zsh

/etc/zprofileが実行されることは注目に値しますafter~/.zshenvなので、ZSHガイドラインに従って$PATHを.zshenvに設定すると、おそらくclobeされますpath_helperによる。この問題が発生している場合は、/etc/zprofile/etc/zshenvに名前変更して、システム$PATHをできるだけ早く設定することをお勧めします。

12
Alan Third

これはbashを指しますが、zshにも適用できると思います。

[〜#〜] path [〜#〜]のデフォルト値は、bashのコンパイル時に決定されます。変更されている可能性がありますが、スタートアップファイルには設定されていません。

FedoraおよびRed Hat Enterprise Linuxの実践ガイド:第7版。 p359。

編集する

さらに掘り下げてみたところ、デフォルトのPATHは実際にはコンパイル時に設定され、 init.c ファイルで確認できることがわかりました。

/* Set default path */
path    = (char **) zalloc(sizeof(*path) * 5);
path[0] = ztrdup("/bin");
path[1] = ztrdup("/usr/bin");
path[2] = ztrdup("/usr/ucb");
path[3] = ztrdup("/usr/local/bin");
path[4] = NULL;

EDIT2:

私はzsh IRCに入りました。開発者は、PATHがコンパイルで設定されていることをすべて示す4つの異なるコマンドのリストを提供できました。これらのコマンドを拡張チャットに投稿しました、ただしX時間後に失われることに気付きませんでした。IRCで開発者に依頼して、自分で確認したいかどうかを確認してください。

1
cremefraiche