bash 中启动的可执行文件的顺序

bash 中启动的可执行文件的顺序

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)"=testenvenv test …

在 zsh 中,您可以使用 禁用内置函数disable test。这是永久的(对于当前 shell 或子 shell),直到使用 重新启用内置函数enable test。在 bash 中,您可以执行相同的操作来enable -n test禁用和enable test重新启用。

您可以使用别名或函数强制执行不同的命令,例如alias test=/usr/bin/testtest () { /usr/bin/test "$@"; }。如果您有这样的别名,您可以通过引用它的任何部分来阻止其使用,例如\test将执行正常的函数/内置/外部查找。请注意,根据 shell 及其设置,函数中的别名定义可能会在读取或执行函数时扩展。如果您定义了一个函数,则可以使用它command test来防止函数查找以及别名查找(因此test除非禁用,否则此处将调用内置函数)。

相关内容