当我在一个目录和回显路径中时
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 是 shell 中不会改变的全局变量。为什么不同目录下这些路径不同?
答案1
我知道这是一个古老的问题,但最近我们有一些新的 ruby 用户遇到了这种“显然不可能”的行为。我回答是为了帮助其他遇到此问题的人。
这是因为您正在使用 ruby - 它正在为每个目录应用本地捆绑包和 gem 设置。你的路径变量是仅仅由于 cd 命令而发生更改 - 因为 ruby 正在处理 cwd 更改并将该目标目录的正确设置(如果 cwd 中没有配置则为全局设置)应用到 ENV。
一个非常常见的情况是,ruby 用户将运行bundle 命令,该命令显然位于 PATH 上(尝试使用哪个bundle),更改目录,然后让bundle 命令未知(不再位于 PATH 上,因为 PATH 已更改为一侧) cd 命令的效果)。
通常这可以通过在有问题的目录中安装 gem 来解决。
答案2
shell中没有全局变量,即不同实例(进程)之间共享的变量。导出的变量被复制到子进程,但从子进程开始,它们是独立的。