Alias

csh 中的別名循環

  • January 10, 2012

為什麼這裡會創建別名循環錯誤:

alias df 'printf "\n"; df -hP | column -t'

但不是在這裡:

alias df 'df -hP | column -t'

我意識到我可以將別名稱為其他名稱並且仍然可以使用它,但是,我正在嘗試了解底層操作。

似乎當別名名稱也是第一個命令時,它不會被解釋為別名,但除此之外它就是。這可以使用絕對路徑來解決:

alias df 'printf "\n"; /bin/df -hP | column -t'

或者,正如基思在評論和回答中指出的那樣,\防止別名擴展:

alias df 'printf "\n"; \df -hP | column -t'

這在 tcsh 手冊頁中有解釋(我懷疑您使用的是 tcsh,而不是 csh);見引用的第三段。

shell 維護一個別名列表,可以通過aliasunalias命令設置、取消設置和列印這些別名。在將命令行解析為簡單命令(請參閱命令)後,檢查每個命令的第一個單詞,從左到右,看它是否有別名。如果是這樣,則將第一個單詞替換為別名。如果別名包含歷史引用,它將經歷歷史替換(qv),就好像原始命令是前一個輸入行一樣。如果別名不包含歷史引用,則參數列表保持不變。

因此,如果“ls”的別名是“ls -l”,那麼命令“ls /usr”就會變成“ls -l /usr”,這裡的參數列表不會受到干擾。如果 lookup' 的別名是 grep !^ /etc/passwd’ 那麼 lookup bill' 將變成 grep bill /etc/passwd’。別名可用於引入解析器元語法。例如,`alias print ‘pr !* | lpr’’ 定義了一個“命令”(“print”),它 pr(1) 將它的參數傳遞給行式列印機。

重複別名替換,直到命令的第一個單詞沒有別名。如果別名替換沒有更改第一個單詞(如前面的範例中),則將其標記為防止循環。檢測到其他循環並導致錯誤。

一個好的解決方法是在命令前加上一個\字元來禁止別名擴展:

alias df 'printf "\n"; \df -hP | column -t'

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