Path

PATH 變數中的重複條目是否會撤銷第一個條目給出的優先級?

  • February 19, 2014

如果我有一個 PATH 變數(當分解為多行時)包含類似這樣的內容(我添加了一些註釋):

/Users/brandon/.rvm/gems/ruby-2.0.0-p353/bin
/Users/brandon/.rvm/gems/ruby-2.0.0-p353@global/bin
/Users/brandon/.rvm/rubies/ruby-2.0.0-p353/bin
/opt/local/bin
/opt/local/sbin
/usr/local/sbin
/usr/local/bin   # <<--- notice this path appears again later
/usr/bin         # <<--- notice this comes AFTER /usr/local/bin
/bin
/usr/sbin
/sbin
/usr/local/bin   # <<--- here it is again!
/usr/local/git/bin
/Users/brandon/bin
/Users/brandon/.homebrew/bin
/usr/local/mysql/bin
/usr/local/share/npm/bin
/Applications/Postgres93.app/Contents/MacOS/bin
/Users/brandon/.rvm/bin

第二個的存在是否有可能/usr/local/bin/導致/usr/bin優先於/usr/local/bin?這似乎很瘋狂(對我來說:我從未聽說過這樣的事情),但這正是我所看到的行為。我剛剛使用 Homebrew 安裝了 PHP,但係統 PHP(來自/usr/bin)優先:

$ which php
/usr/bin/php

但是,在手動更改 PATH 之後(而不是探勘我提供的所有文件.zshrc以試圖找出重複的原因和來源)以刪除 的第二個實例/usr/local/bin,我發現它/usr/local/bin優先於/usr/bin我本來的首先期望它:

$ which php
/usr/local/bin/php

什麼會導致這個?這是正常的嗎?

hash -r(for bash)如果您剛剛安裝了一個二進製文件,shell 可能不會立即知道它,因為它確實維護了一個記憶體(相對於掃描PATH每個命令。)

路徑按順序掃描,重複完全沒有區別。但是,較笨的 shell 可能會多次掃描重複條目——如果 foo 存在兩次並且 bar 不在 foo 中,則 foo 可能會被掃描兩次。

引用自:https://unix.stackexchange.com/questions/115992