2 つのディレクトリ間で $PATH 変数が異なるのはなぜですか?

2 つのディレクトリ間で $PATH 変数が異なるのはなぜですか?

あるディレクトリにいてパスをエコーし​​ているとき

pwd
/Users/me/src/some_proj

echo $PATH
/Users/me/.gem/ruby/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/lib/ruby/gems/2.0.0/bin:/opt/boxen/chruby/versions/2.0.0-
p353/bin:bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-
build/bin:node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

別のディレクトリにいるときにパスをエコーすると

pwd
/Users/me/src_personal/my_gems/som_gem

echo $PATH
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
bin:/opt/boxen/chruby/bin:/opt/boxen/ruby-build/bin:
node_modules/.bin:/opt/boxen/nodenv/shims:/opt/boxen/nodenv/bin:
/opt/boxen/bin:/opt/boxen/homebrew/bin:/opt/boxen/homebrew/sbin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

異なる $PATH が表示されます。$PATH はシェル内の変更されないグローバル変数だと思っていました。なぜこれらのパスはディレクトリによって異なるのでしょうか?

答え1

これは古い質問だとはわかっていますが、最近、新しい Ruby ユーザーがこの「明らかに不可能な」動作に遭遇しました。これに遭遇した他のユーザーを助けるために回答します。

これは、各ディレクトリにローカルバンドルとgem設定を適用するrubyを使用しているためです。PATH変数単に cd コマンドによって変更されるのは、Ruby が cwd の変更を処理し、そのターゲット ディレクトリの正しい設定 (cwd に構成がない場合はグローバル設定) を ENV に適用するためです。

非常に一般的なシナリオは、Ruby ユーザーが、明らかに PATH 上にある (which bundle を試してください) bundle コマンドを実行し、ディレクトリを変更した後、bundle コマンドが不明になる (cd コマンドの副作用として PATH が変更されたため、PATH 上にはなくなる) というものです。

通常、これは問題のあるディレクトリに gem をインストールすることで解決できます。

答え2

シェルにはグローバル変数、つまり異なるインスタンス (プロセス) 間で共有される変数はありません。エクスポートされた変数は子プロセスにコピーされますが、そこからは独立しています。

関連情報