題 別名不會“覆蓋”PATH條目?


我的最後一行 .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 ..?


8
2017-08-29 19:10


起源


記錄:從技術上講,別名可以 不 覆蓋中的任何值 PATH ENVAR。 - can-ned_food
強制性警告:一般情況下,重命名常用命令並不是一種好習慣。這可以咬你兩種方式。 1)如果你在另一個系統上工作並習慣使用你的命令,你將得到本機命令的意外行為。 2)如果其他人使用您的系統,即使建議/幫助您解決問題,他們也會得到您的自定義的意外行為。自定義命令很好,只是不要將它們命名為常見的命令。 - Joe
@joe實際上更多的是 相反 這裡:os / x版本 CP 缺乏選擇 nix所以它的行為不符合預期(除了那些*喜歡的人) 蹣跚的mac版本) - javadba


答案:


which command只返回可執行文件:它對別名一無所知,因為它是一個外部程序,並且沒有將別名信息傳遞給子進程的機制。

如果輸入命令 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 啟動腳本,具有用戶權限。


20
2017-08-29 19:26



雖然在CentOS(和AIUI所有RedHat)上,標準配置文件(除非被覆蓋)創建了一個 別號 對於 which 運行 /usr/bin/which 輸入來自輸出 alias 以及一個選項,告訴它讀取該輸入並使用它來顯示與命令匹配的別名。看到 unix.stackexchange.com/questions/10525/... - dave_thompson_085
@ dave_thompson_085 - 有趣的評論:我沒有使用過這些發行版。我使用Ubuntu,我可以通過簡單的別名來獲得相同的效果 which至 type。然後 which -a 像外部程序一樣運行,添加了別名和函數定義。一般來說,我沒有 alias which=type,因為我喜歡用 $(which ProgName) 當我想強制使用外部程序時,繞過任何別名或函數定義。 - AFH
硬鏈接不能跨文件系統,所以非符號 ln 只有當您的主目錄與文件系統相同時,建議才有效 /usr/local/bin。如果你更新,它也會表現得很奇怪 gcp,因為您的硬鏈接可能仍會引用舊版本。 - Useless
@Useless - 有效點,這是我編輯我的答案的一部分,首先建議一個符號鏈接,儘管我認為權限可能是最重要的考慮因素。至於更新 gcp,這取決於更新是通過打開和寫入,還是通過刪除和重新創建來完成的。請注意,絕對路徑或相對源路徑是否用於創建硬鏈接是無關緊要的,而符號鏈接通常需要絕對路徑。鏈接在操作系統中廣泛使用,它們大多是像徵性的。 - AFH
@ can-ned_food - 它並不像在當前shell中設置它那麼簡單:必須在每個腳本中設置它,同時導入別名。 - AFH


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

which 不是Bash內置的(它是內置於其他一些shell中,例如zsh)。以來 which 沒有特權信息進入Bash的別名, which 只是翻閱 PATH 對於給定的期限。

type, 另一方面  一個Bash內置,所以它可以報告別名。


13
2017-08-29 19:26



而且,只有在命令中的第一個單詞時才會擴展別名。也許那是不相關的。 - can-ned_food