Alias
csh 中的別名循環
為什麼這裡會創建別名循環錯誤:
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 維護一個別名列表,可以通過alias和unalias命令設置、取消設置和列印這些別名。在將命令行解析為簡單命令(請參閱命令)後,檢查每個命令的第一個單詞,從左到右,看它是否有別名。如果是這樣,則將第一個單詞替換為別名。如果別名包含歷史引用,它將經歷歷史替換(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'