根据其手册yash
, shell 有一个printf
内置的。
但是,这是我在yash
默认配置的 shell 中看到的:
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf
这个shell中是否printf
内置了一个?对于许多其他所谓的内置实用程序,这些实用程序也可作为外部命令使用,结果是相似的。
作为比较,在pdksh
(ksh
在 OpenBSD 上, whereprintf
不是内置的):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
并且在bash
(哪里printf
是内置的):
$ command -v printf
printf
$ type printf
printf is a shell builtin
yash
Shell确实printf
具有并且确实使用了(和其他实用程序)的内置版本。它恰好在制定command -v
andtype
命令的结果的方式上非常符合 POSIX 标准。正如 mosvy 评论一样,POSIX 标准要求常规内置命令可用作
$PATH
要执行的内置版本的命令的外部命令。这是标准中的相关文本:
这意味着 的输出
command -v printf
表示在搜索路径中printf
找到了该命令,而 的输出添加了该命令是常规内置命令。type printf
由于
printf
在搜索路径中找到了该命令,并且由于它是 shell 中的常规内置命令,yash
因此将调用其内置版本的命令。如果在路径printf
中找不到,并且yash
shell 以 POSIX-ly 正确模式运行,则会生成错误。yash
以成为一个非常符合 POSIX 的外壳而自豪,如果我们看看POSIX 所说command -v
的话,这也是正确的:Watanabe shell 具有三种内置函数,在其手册中有详细描述。所有的内置命令也都列在那里,但是人们必须从没有任何说明该命令是“特殊”或“半特殊”的注释中推断出某些东西是“常规”内置命令内置。常规内置插件未标记。
printf
是一个这样的“常规”内置。在本机模式下,无论是否找到该名称的外部命令,它总是被调用。但是当
posixly-correct
设置了 shell 选项时,如果外部命令可以在PATH
.这实际上符合单一 Unix 规范所说的,并且至少从 1997 年就已经说过了。
它不同于 Z shell、93 Korn shell、Bourne Again shell 和 Debian Almquist shell,它们都没有实现或记录常规内置程序的这种行为。例如,Z shell在搜索.
PATH
Debian Almquist shell 也是如此。这就是这些 shell 所做的一切,即使调用sh
它们的开启 POSIX 选项也是如此。但是,不运行
printf
时不运行PATH
是 PD Korn shell、Heirloom Bourne shell 和 MirBSD Korn shell 的行为;因为他们一开始就没有printf
内置的。☺