如何禁用shell关键字?

Rad*_*anu 4 command-line bash

使用enable内置命令,我们可以禁用 shell 内置命令,例如echo,如下所示:

enable -n echo
Run Code Online (Sandbox Code Playgroud)

但是我们如何禁用 shell 关键字,例如time?如果我们尝试:

enable -n time
Run Code Online (Sandbox Code Playgroud)

我们将得到以下“答案”:

bash: enable: time: not a shell builtin
Run Code Online (Sandbox Code Playgroud)

注意:我知道如何运行里面的time那个/usr/bin,所以我只想知道是否有可能完成我在标题中提出的要求。

Sté*_*las 6

你可以做:

alias time='"time" '
Run Code Online (Sandbox Code Playgroud)

(作为奖励,尾随空格允许在它之后进行别名扩展)。

引用一个关键字(关键字是 shell 语言语法的一部分)会阻止它被解释为一个关键字,所以在这里,对其执行正常的命令查找。

它适用于bash, zsh, mksh, 但不适用于ksh93,ashyash

请注意,对于非交互式bash实例(如在脚本中),shopt -s expand_aliases与其他 shell 不同,您需要bash在非交互式时默认不扩展别名。


kon*_*box -2

您无法禁用它,但可以使用函数隐藏它。使用风险自负。

shell_builtin() {
    :  ## Do nothing.
}
Run Code Online (Sandbox Code Playgroud)

要重新启用它,只需取消设置即可:

unset shell_builtin
Run Code Online (Sandbox Code Playgroud)

  • @holasz 我很仓促地回答了它。“time”是一个特殊的关键字,可能位于“if”、“while”、“case”等级别,这就是为什么你不能禁用它。 (4认同)