私がディレクトリにあり、パスをエコーするとき
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ユーザーがこの「明らかに不可能な」動作を経験しました。この問題が発生した他の人を助けるために答えています。
これはRubyを使っているからです。ディレクトリごとにローカルバンドルとgem設定を適用しています。パス変数はい変更は cd コマンドによって発生します。これは、Rubyがcwdの変更を処理し、そのターゲットディレクトリの正しい設定(またはcwdで構成されていない場合はグローバル設定)をENVに適用するためです。
非常に一般的なシナリオは、Rubyユーザーが明らかにPATH(バンドルが試行されている)にあるバンドルコマンドを実行し、ディレクトリを変更してからバンドルコマンドを未知のままにすることです(PATHにすでに存在するため、PATHにはもうありません。 )。片側に変更)cdコマンド)。
通常、この問題はそのディレクトリにgemをインストールすることで解決されます。
答え2
シェルにはグローバル変数はありません。つまり、異なるインスタンス(プロセス)間で共有される変数です。エクスポートされた変数は子プロセスにコピーされますが、子プロセスが開始されたときから独立しています。