我的最後一行.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
您將按照優先順序看到所有可能的解釋。這包括任何別名,因為它type
是bash
內部命令。
重要的是要認識到別名不會被子進程解釋,例如具有運行系統命令選項的腳本或互動式編輯器。
如果您建立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 內建函數,因此它可以報告別名。