测试是 shell 内置的还是实际的程序?
bruce@Bruce:~$ type -a test
test is a shell builtin
test is /usr/bin/test
bruce@Bruce:~$
bruce@Bruce:~$ file /usr/bin/test
/usr/bin/test: ELF 64-bit LSB executable
bruce@Bruce:~$
我的系统正在运行 Ubuntu 13.04 和 BASH 4.2.45(1)-release。
答案1
看来我第一次接触时并没有真正理解你的问题。我会尝试进一步解释……
尽管该程序test
是 GNU coreutils 软件包的一部分,因此将随任何 GNU/Linux 系统一起提供,但它也被编译为bash
大多数发行版中的内置程序。我猜这是为了提高性能,因为它不需要为每个条件语句启动一个子进程。不用说,如果系统中同时存在内置程序和二进制程序,shell 将使用内置程序而不是二进制程序。但您可以调用:
/usr/bin/test ...
...如果您想明确调用二进制文件。
还要注意的是,bash
在大多数系统上,这不是唯一的 shell,其他 shell 可能没有此内置功能(例如dash
)。此外,有些系统甚至可能没有bash
安装。对于这种情况,可以使用 coreutils 中的二进制文件。
它很可能是系统内置的。要检查此类型,请输入:
help test
如果您看到帮助页面,则它是内置的
您也可以输入:
type -t test
由此可见:
builtin
在我的系统上
答案2
test
是 bash 内部的虚拟命令,或者您可以称之为builtin
。/usr/bin/test
存在以及外部command
。 除了内置命令和命令之外,functions
您还可以将其视为自定义内置命令。 调用它们的优先级是:首先是函数,其次是内置命令,最后是外部二进制文件或命令;但您可以自定义它。
如果您以某种方式创建了一个与内置函数同名的函数,例如cd
,要跳过调用该函数并调用内置函数cd
,则可以使用内置命令builtin
例如builtin cd args
。
同样,如果您有一个内置命令,其名称与存储在文件系统中的命令相同,例如test
,要调用该命令test
,您可以给出明确的路径例如/usr/bin/test
或使用内置命令command
例如command test -n xyz
。
为了更多地了解它,请尝试运行以下命令:
help
help builtin
help command
答案3
从历史上看,test
(及其同义词[
)是(并且仍然是)外部程序。但大多数 shell 将它们作为内置命令提供以提高效率。常见命令如true
、false
、printf
、echo
等也是如此。
答案4
作为对先前答案的补充,可以使用内置命令enable
来启用[或禁用]给定命令的内置版本cmd
(例如test
),方法是enable [-n] cmd
。的文档enable
正是test
以我的系统为例。
enable -a
显示内置命令列表及其激活状态。