在尝试向相关问题添加更多细节时,我意识到我不知道如何指定要执行的可用 Bash 字类型之一。按help type字型分为五种:
一个词可能有多种类型(true只是一个例子;更常见的覆盖词是cd):
$ type -a true
true is a shell builtin
true is /bin/true
Run Code Online (Sandbox Code Playgroud)
您如何强制执行特定的同义词?到目前为止,按优先顺序:
别名:这是一种特殊情况,因为它优先于所有其他同义词。如果未定义别名,则强制执行此操作仅在命令失败时有用。
$
Run Code Online (Sandbox Code Playgroud)关键词:
$
Run Code Online (Sandbox Code Playgroud)功能:
$
Run Code Online (Sandbox Code Playgroud)内置:
$ builtin true
Run Code Online (Sandbox Code Playgroud)文件:
$ command true
$ $(which true)
$ /bin/true
Run Code Online (Sandbox Code Playgroud)引用一个词不包括别名和关键字。那是,
$ '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 中是有效的(但很愚蠢)。