為什麼兩個目錄之間的 $PATH 變數不同?

為什麼兩個目錄之間的 $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 是 shell 中不會改變的全域變數。為什麼不同目錄下這些路徑會不同?

答案1

我知道這是一個古老的問題,但最近我們有一些新的 ruby​​ 用戶遇到了這種「顯然不可能」的行為。我回答是為了幫助其他遇到此問題的人。

這是因為您正在使用 ruby​​ - 它正在為每個目錄應用本地捆綁包和 gem 設定。你的路徑變數僅由於 cd 命令而發生更改 - 因為 ruby​​ 正在處理 cwd 更改並將該目標目錄的正確設置(或全域設置,如果 cwd 中沒有配置)應用到 ENV。

一個非常常見的情況是,ruby 用戶將運行bundle 命令,該命令顯然位於 PATH 上(嘗試使用哪個bundle),更改目錄,然後讓bundle 命令未知(不再位於 PATH 上,因為 PATH 已更改為一側) cd 指令的效果)。

通常這可以透過在有問題的目錄中安裝 gem 來解決。

答案2

shell中沒有全域變量,即不同實例(進程)之間共享的變數。導出的變數被複製到子進程,但從子進程開始,它們是獨立的。

相關內容