![如何取消意外创建的 zsh 命令的定义?](https://linux22.com/image/176300/%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%84%8F%E5%A4%96%E5%88%9B%E5%BB%BA%E7%9A%84%20zsh%20%E5%91%BD%E4%BB%A4%E7%9A%84%E5%AE%9A%E4%B9%89%EF%BC%9F.png)
我想在所有 Python 文件中搜索字符串“.vars()”,不知何故我重新定义了“grep”,如下所示:
% grep .vars() *.py
% which grep
grep () {
*.py
}
我尝试使用unset grep
并export 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; … }
也是可移植的,并且在子 shell 中运行函数的主体。其他复合命令在技术上是有效的,例如name () ( instruction; )
是一个符合 POSIX 标准的函数定义,但在实践中却极为罕见。name () if condition; then instruction1; else instruction2; fi
根据 zsh(以及 ksh 和 dash),这是一个完全有效的函数定义,但根据 POSIX 或 bash 则不是。name () echo hello
()
在所有 shell 中,前面的空格都是可选的。
要撤消 的效果grep .vars() *.py
,请取消设置这两个函数。
unset -f grep .vars
或者
unfunction grep .vars
答案3
你已经定义了一个功能。这仅在当前 shell 中有效。
一个简单的函数就像
f() echo hello
现在“f”命令会打招呼
$ f
hello
清除它的最简单方法是使用unset -f
命令。
在你的情况下:
unset -f grep