如何取消意外创建的 zsh 命令的定义?

如何取消意外创建的 zsh 命令的定义?

我想在所有 Python 文件中搜索字符串“.vars()”,不知何故我重新定义了“grep”,如下所示:

% grep .vars() *.py                                                         
% which grep
grep () {
    *.py
}

我尝试使用unset grepexport grep=/bin/grep纠正这个问题,但没有成功。有人可以解释一下我不小心做了什么吗?

注意:在 Bash 中,它失败并显示:

“意外标记‘(’附近出现语法错误”。

答案1

这里定义了两个函数,一个是named grep,另一个是named vars,其函数体是*.py

grep .vars() *.py                                                         

要删除这些函数并取消阴影grep,您需要:

$ unset -f grep .vars

man zshbuiltins

unset [ -fmv ] name ...
        ...
        unset -f is equivalent to unfunction.
...
unfunction
        Same as unhash -f.
...
unhash
        ...
        The  -f  option causes unhash to remove shell functions.

答案2

这是一个函数定义。更准确地说,这是用相同的代码定义两个函数。它看起来很不寻常,因为 zsh 对函数定义的基本语法有几个扩展name () { instruction; … }

  • Zsh 允许多个名称。name1 name2 () { instruction; … }定义了函数name1和 并name2具有相同的主体。我不知道还有其他 shell 支持这个。
  • Zsh 允许.输入函数名称(例如 bash,但不允许使用 dash 或 ksh93)。可移植函数名称只能使用 ASCII 字母、数字和下划线。
  • Zsh 允许任何命令作为函数主体。某些 shell(尤其是 bash)需要复合命令(这是 POSIX 的全部要求)。
    name () { instruction; … }
    
    是最常见的形式,其中主体是一个团体。
    name () ( instruction; )
    
    也是可移植的,并且在子 shell 中运行函数的主体。其他复合命令在技术上是有效的,例如
    name () if condition; then instruction1; else instruction2; fi
    
    是一个符合 POSIX 标准的函数定义,但在实践中却极为罕见。
    name () echo hello
    
    根据 zsh(以及 ksh 和 dash),这是一个完全有效的函数定义,但根据 POSIX 或 bash 则不是。
  • ()在所有 shell 中,前面的空格都是可选的。

要撤消 的效果grep .vars() *.py,请取消设置这两个函数。

unset -f grep .vars

或者

unfunction grep .vars

答案3

你已经定义了一个功能。这仅在当前 shell 中有效。

一个简单的函数就像

f() echo hello

现在“f”命令会打招呼

$ f
hello

清除它的最简单方法是使用unset -f命令。

在你的情况下:

unset -f grep

相关内容