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

Bru*_*Kim 7 zsh function

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

% grep .vars() *.py                                                         
% which grep
grep () {
    *.py
}
Run Code Online (Sandbox Code Playgroud)

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

注意:在 Bash 中,它失败了:

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

And*_*ton 15

这定义了两个函数,一个名为grep,另一个名为vars,其主体为*.py

grep .vars() *.py                                                         
Run Code Online (Sandbox Code Playgroud)

要删除这些功能 --- 并取消阴影grep--- 您需要:

$ unset -f grep .vars
Run Code Online (Sandbox Code Playgroud)

来自man zshbuiltins

$ unset -f grep .vars
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 9

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

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

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

unset -f grep .vars
Run Code Online (Sandbox Code Playgroud)

或者

unfunction grep .vars
Run Code Online (Sandbox Code Playgroud)


Ste*_*ris 5

您已经定义了一个函数。这仅在当前 shell 中有效。

一个简单的函数就像

f() echo hello
Run Code Online (Sandbox Code Playgroud)

现在“f”命令会打招呼

$ f
hello
Run Code Online (Sandbox Code Playgroud)

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

在你的情况下:

unset -f grep
Run Code Online (Sandbox Code Playgroud)