Zsh是一个非常强大的外壳,但有一段时间我感到惊讶,因为它走得太远了。
最近,在输入以下命令(为简单和清晰度而改编)之后,我遇到了令人惊讶的令人费解的时刻之一:
% echo "nosuchfunction() nosuchcommand"
nosuchfunction() nosuchcommand
% echo nosuchfunction() nosuchcommand
% echo "nosuchfunction() nosuchcommand"
echo:3: command not found: nosuchcommand
% echo I used to like this
echo:4: command not found: nosuchcommand
我花了一段时间来了解发生了什么,这是zsh特有的,而不是我试图执行的命令。在第2行,我创建了某种内联函数,并将其赋值为“echo”。至少这是根据第3和第4行的输出有意义的唯一解释。
作为比较,在bash中事情会更有意义:
% echo "nosuchfunction() nosuchcommand"
nosuchfunction() nosuchcommand
% echo nosuchfunction() nosuchcommand
bash: syntax error near unexpected token `('
% echo "nosuchfunction() nosuchcommand"
nosuchfunction() nosuchcommand
% echo I used to like this
I used to like this
此时我也不确定这是否应该是一个功能或错误,但我只想禁用此行为。
任何人都知道怎么做?
答案 0 :(得分:3)
实际上你创建了两个函数,echo
和nosuchfunction
,都执行nosuchcommand
。
zsh
不仅允许'内联函数定义'(如:如果函数只包含一个命令,则不需要使用大括号或parenthis),但也允许给同一函数赋予多个名称。来自zshmisc(1)
:
function word ... [ () ] [ term ] { list }
word ... () [ term ] { list }
word ... () [ term ] command
where term is one or more newline or ;. Define a function which is
referenced by any one of word. Normally, only one word is provided;
multiple words are usually only useful for setting traps. The
body of the function is the list between the { and }. See the
section `Functions'.
两个功能(不是错误)都不是可选的,无法启用。
最好记住括号是句法元素,在zsh
以及bash
中,如果你不想这样使用它们,你必须引用它们。 (并不像第二行在bash
中有效,所以只是禁用'内联定义'无论如何也无法解决任何问题。)