如何强制 Bash 单词引用别名、函数、文件等?

l0b*_*0b0 13 bash

在尝试向相关问题添加更多细节时,我意识到我不知道如何指定要执行的可用 Bash 字类型之一。按help type字型分为五种:

  • 别名
  • 关键词
  • 功能
  • 内置
  • 文件

一个词可能有多种类型(true只是一个例子;更常见的覆盖词是cd):

$ type -a true
true is a shell builtin
true is /bin/true
Run Code Online (Sandbox Code Playgroud)

您如何强制执行特定的同义词?到目前为止,按优先顺序:

部分解决方案

Sté*_*las 10

你问的真的没有多大意义。

关键字意味着它是一个单词,它是 shell 语法的一部分。这些是通过标记化来识别的。引用它们足以让 shell 停止识别。

不过,可以在大多数 shell 中为关键字设置别名。因此,别名优先于关键字(实际上,它们会提前扩展,然后有更多标记化,您可以拥有更多别名、关键字)...

别名(除了定义为的 zsh 别名alias -g仅在命令位置扩展),因此通常不在builtin the-alias.

函数优先于内置命令,内置命令优先于外部命令(然后$PATH决定使用哪一个)。

您可以使用以下命令强制内置:

builtin the-cmd and its args
Run Code Online (Sandbox Code Playgroud)

(尽管应该注意它不是标准命令)。

您可以通过引用它们来禁用别名(尽管引用的版本也可以在某些 shell 中使用别名)。

因此,例如(这里是 zsh 语法),在:

'while'() echo function while
alias 'while=echo alias while'
Run Code Online (Sandbox Code Playgroud)

写入while true实际上会输出alias while true,并且无法使用while关键字,因为引用它会禁用别名和关键字。

例如,您可以使用以下命令调用该while函数:

'whi'le whatever
Run Code Online (Sandbox Code Playgroud)

如果有一个while内置函数(当然他们不会在那些有while关键字的shell 中),你会写它:

builtin while whatever
Run Code Online (Sandbox Code Playgroud)

并调用while命令,你会写:

env while whatever
Run Code Online (Sandbox Code Playgroud)

或在zsh(不在sh仿真中时):

command while whatever 
Run Code Online (Sandbox Code Playgroud)

(在其他 shell 中,command只阻止函数,而不是内置函数)

或者

/full/path/to/while whatever
Run Code Online (Sandbox Code Playgroud)

当然,没有什么能阻止你做更愚蠢的事情,比如:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }
Run Code Online (Sandbox Code Playgroud)

其中,至少在 zsh 中是有效的(但很愚蠢)。