如何在zsh中禁用内联函数定义

时间:2014-03-12 12:19:42

标签: zsh

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

此时我也不确定这是否应该是一个功能或错误,但我只想禁用此行为。

任何人都知道怎么做?

1 个答案:

答案 0 :(得分:3)

实际上你创建了两个函数,echonosuchfunction,都执行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中有效,所以只是禁用'内联定义'无论如何也无法解决任何问题。)