为什么会在此处创建别名循环错误:
alias df 'printf "\n"; df -hP | column -t'
Run Code Online (Sandbox Code Playgroud)
但不是这里:
alias df 'df -hP | column -t'
Run Code Online (Sandbox Code Playgroud)
我意识到我可以将别名称为其他名称并且仍然可以工作,但是,我正在尝试了解底层操作。
这在 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'' 定义了一个 ``command'' (`print'),它将 pr(1) 的参数传递给行式打印机。
重复别名替换,直到命令的第一个单词没有别名。如果别名替换没有改变第一个单词(如前面的例子),它被标记为防止循环。检测到其他循环并导致错误。
一个好的解决方法是在命令之前添加一个\字符来禁止别名扩展:
alias df 'printf "\n"; \df -hP | column -t'
Run Code Online (Sandbox Code Playgroud)
看来,当别名也是第一个命令时,它不会被解释为别名,而是被解释为别名。这可以通过绝对路径解决:
alias df 'printf "\n"; /bin/df -hP | column -t'
Run Code Online (Sandbox Code Playgroud)
或者,正如 Keith 在评论和回答中指出的那样,\防止别名扩展:
alias df 'printf "\n"; \df -hP | column -t'
Run Code Online (Sandbox Code Playgroud)