为什么这里会产生别名循环错误:
alias df 'printf "\n"; df -hP | column -t'
但不在这里:
alias df 'df -hP | column -t'
我意识到我可以将别名称为其他名称并且仍然可以正常工作,但是,我正在尝试了解底层操作。
答案1
这在 tcsh 手册页中有解释(我怀疑您使用的是 tcsh,而不是 csh);参见引用的第三段。
shell 维护一个别名列表,可以通过 shell 设置、取消设置和打印这些别名。别名和乌别名命令。将命令行解析为简单命令后(请参阅命令)检查每个命令的第一个字(从左到右)是否有别名。如果有,则用别名替换第一个字。如果别名包含历史引用,则进行历史替换(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'
答案2
看起来,当别名也是第一个命令时,它不会被解释为别名,但除此之外它还被解释为别名。这可以通过绝对路径来解决:
alias df 'printf "\n"; /bin/df -hP | column -t'
或者,正如 Keith 在评论和回答中指出的那样,\
可以防止别名扩展:
alias df 'printf "\n"; \df -hP | column -t'