あるディレクトリにいてパスをエコーしているとき
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
シェルにはグローバル変数、つまり異なるインスタンス (プロセス) 間で共有される変数はありません。エクスポートされた変数は子プロセスにコピーされますが、そこからは独立しています。