別名不會「覆蓋」路徑條目嗎?

別名不會「覆蓋」路徑條目嗎?

我的最後一行.bash_profile是:

alias cp=/usr/local/bin/gcp

然而,這被我的條目壓扁了$PATH

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

我曾以為別名會覆蓋PATH.. ?

答案1

which命令僅傳回可執行檔:它對別名一無所知,因為它是外部程序,並且沒有將別名資訊傳遞給子進程的機制。

如果您輸入命令,type -a cp您將按照優先順序看到所有可能的解釋。這包括任何別名,因為它typebash內部命令。

重要的是要認識到別名不會被子進程解釋,例如具有運行系統命令選項的腳本或互動式編輯器。

如果您建立cp函數,那麼您的版本將在腳本中運行,儘管不是從其他程式運行:

cp() { /usr/local/bin/gcp "$@"; }

如果您希望cp在任何地方工作,請$HOME/bin在清單的頂部添加PATH並指向$HOME/bin/cp它:

ln -s /usr/local/bin/gcp $HOME/bin/cp

這將創建一個符號鏈接,儘管您可以將其設置為稍微更有效率的硬鏈接(省略-s),但這通常需要 root 權限(sudo ln ...)。建立函數並新增至變數將在具有使用者權限的啟動腳本PATH之一中完成。bash

答案2

別名是 shell 內部的。其他程式不會知道它們。

which不是 Bash 內建指令(它是其他一些 shell 中的內建指令,例如 zsh)。由於which沒有 Bash 別名的特權信息,因此which只需查找PATH給定的術語。

type, 另一方面Bash 內建函數,因此它可以報告別名。

相關內容