test
如果我在 bash 中执行命令, test
(评估条件表达式)内置实用程序将启动:
$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$
但是,如上面的输出所示type -a test
, /usr/local/bin 目录中有另一个test
, /usr/bin 目录中有另一个。可执行文件是如何排序的,即始终首选内置命令,然后其余命令取决于 $PATH 变量中的目录顺序?此外,是否可以更改可执行文件的启动顺序,例如,如果我输入test
,则启动 /usr/bin/test 而不是 bash-builtin test
?
答案1
最高优先级是 bash 别名,然后是特殊内置函数(仅在 POSIX 模式下),然后是函数,然后是内置函数,然后是在$PATH
.
要执行内置函数,请使用builtin test
.
要执行外部应用程序,请使用显式路径:/bin/test
。
要忽略函数和别名,请使用command test
.
要绕过别名,请使用\test
或任何其他类型的扩展。
可以禁用/启用内置的enable test
.
(根据下面的评论更新)
(修复了 bash 内置的不正确的管理编辑disable
- 事实上,只有enable
)
答案2
内置命令始终优先于外部命令。理由是内置命令速度更快(并且在少数情况下,例如cd
或,只有内置命令才能达到预期的效果)。test -o BASH_OPTION
有时,外部命令可能具有 shell 内置命令所没有的功能。在这种情况下,您可以通过给出显式路径(即包含斜杠)来调用外部命令(这会绕过对 中顺序的任何关注$PATH
)。如果您不想硬编码外部路径,但确实想阻止使用内置路径,则可以在 bash、ksh 和zsh 中使用"$(type -P test)"
(注意大写)。强制使用外部命令的另一种方法是使用实用程序 ( )。P
"$(whence -p test)"
=test
env
env test …
在 zsh 中,您可以使用 禁用内置函数disable test
。这是永久的(对于当前 shell 或子 shell),直到使用 重新启用内置函数enable test
。在 bash 中,您可以执行相同的操作来enable -n test
禁用和enable test
重新启用。
您可以使用别名或函数强制执行不同的命令,例如alias test=/usr/bin/test
或test () { /usr/bin/test "$@"; }
。如果您有这样的别名,您可以通过引用它的任何部分来阻止其使用,例如\test
将执行正常的函数/内置/外部查找。请注意,根据 shell 及其设置,函数中的别名定义可能会在读取或执行函数时扩展。如果您定义了一个函数,则可以使用它command test
来防止函数查找以及别名查找(因此test
除非禁用,否则此处将调用内置函数)。