Bash

處理重複的程序名稱bash

  • January 16, 2016

我想知道是否$PATH 級聯條目。你們都需要在這裡與我一起信仰飛躍,但就在這裡。

假設我們有一個 Java 執行檔,/usr/bin/java但這個版本非常舊且過時。不幸的是,我們沒有su訪問權限,所以我們不能直接替換它。但是,我們可以在本地下載 JRE/JDK 的目前版本並指向更新的版本。我的問題是,bash 如何處理我們有兩個或多個同名但位於兩個或多個不同位置的執行檔的情況?java當我們在控制台中輸入時,bash 是否會以某種方式選擇執行哪一個?假設/usr/bin有許多我們需要的其他執行檔,如何$PATH尋找這樣的東西才能正常工作?

理想情況下,當我們鍵入時,java -version我們應該看到:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

代替

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) Client VM(build 24.45-b08, mixed mode, sharing)

我敢肯定這個問題之前已經被問過,並且有一些與之相關的行話。我瀏覽了 SE、SO 和一些論壇,但沒有發現任何結論。

$PATH的搜尋順序。例如,如果echo $PATHshow /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin,每個目錄都會按順序搜尋給定命令(假設命令不是別名或內置 shell)。

如果您想在每個使用者的基礎上覆蓋特定的二進製文件(或者您只是無權覆蓋除您自己之外的其他使用者),我建議bin您在主目錄中創建一個目錄,然後在PATH 變數前面加上目錄。

像這樣:

$ cd ~
$ pwd
/home/joe
$ mkdir bin
$ echo "$PATH"
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> .bash_profile

然後source .bash_profilePATH定義將生效(或者只是註銷並登錄,或者重新啟動終端仿真器)。

$ source .bash_profile
$ echo "$PATH"
/home/joe/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

現在,您放入的任何執行檔都/home/joe/bin/將優先於系統二進製文件和執行檔。


請注意,如果您確實具有系統訪問權限並且覆蓋應該適用於所有使用者,則放置覆蓋執行檔的首選位置是/usr/local/bin,這是為此目的而設計的。事實上往往/usr/local/bin已經第一個$PATH專門允許這樣做的目錄。

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