bashrc 中的 PATH 首選項

bashrc 中的 PATH 首選項

我想知道在以下情況下會發生什麼。假設我在 .bashrc 的 PATH 目錄中有一個可執行檔。如果我將文件複製到 PATH 中設定的另一個目錄中,然後從終端執行該文件,我正在運行哪個副本?

我可以設定一個首選項說“如果一個文件存在於 PATH 中的多個位置,則在第一個位置執行該文件,而不是在第二個位置執行該文件。”

答案1

快速回答

要找出bash將嘗試執行哪個副本,請使用 bash 的內建實用程式typedu例如,要找出將執行哪個副本,請執行:

$ type du
du is /usr/bin/du

理論

當您要求bash執行某些操作時,bash請執行兩個步驟:

首先,它檢查快取中的檔案位置。這是可執行檔名稱的清單以及檔案上次bash執行時所在的位置。

其次,如果檔案不在快取中,它會檢查路徑,從左到右搜尋路徑中的每個目錄。

請注意,答案取決於您在執行複製之前是否碰巧在當前 shell 中運行了可執行檔。如果是這樣,bash可能已將其位置保存在快取中,並且它將忽略製作副本後它可能位於的任何新位置。如果不在快取中,那麼執行哪個檔案只取決於路徑中目錄的順序。

更多細節

若要查看 bash 目前快取中的內容,請執行:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

上面顯示,du當我運行它時,它僅在快取中。如果我執行更多命令然後再次運行它,快取中就會有更多命令。

若要查看目前路徑是什麼,請執行:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin

該路徑是一個以冒號分隔的清單。上面顯示了路徑中的五個目錄。將從左側開始向右搜尋。

我可以設定偏好嗎?

是的,您可以變更路徑中目錄的順序。

或者,對於互動式工作,您可以設定別名。例如:

$ alias dd=/opt/bin/dd

設定完上面的別名後,你可以dd在命令列輸入,bash會忽略快取並忽略PATH,並執行(或嘗試執行)/opt/bin/dd

相關內容