yash外壳有一个内置的printf,根据它的手册。
但是,我在默认配置的yash shell中看到了这一点:
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printfprintf在这个外壳中是内置的吗?其结果类似于其他一些被认为是内置的实用程序,这些实用程序也可以作为外部命令使用。
相比之下,在pdksh (ksh on OpenBSD,其中printf不是内置的)中:
$ 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发布于 2019-01-23 18:46:17
yash shell确实有并确实使用了内置版本的printf (和其他实用程序)。在制定command -v和type命令的结果时,它恰好是非常符合POSIX的。
作为莫须有的评论,POSIX标准要求在执行命令的内置版本时,常规内置命令在$PATH中可以作为外部命令使用。
这是标准中的相关文本:
如果一个简单的命令导致一个命令名和一个可选的参数列表,则应执行以下操作:
- ii. If the search is unsuccessful, the command shall fail with an exit status of 127 and the shell shall write an error message.这意味着command -v printf的输出意味着在搜索路径中找到了printf命令,而type printf的输出增加了命令是一个常规内置的输出。
由于printf命令是在搜索路径中找到的,而且它是shell中的常规内置命令,所以yash将调用其内置版本的命令。如果在路径中找不到printf,如果yash外壳在POSIX正确模式下运行,则会生成错误。
yash以自己是一个非常兼容POSIX的shell而自豪,如果我们查看POSIX说了什么command -v,这也是正确的:
-v将一个字符串写入标准输出,该输出指示shell将在当前shell执行环境中使用的路径名或命令(请参见Shell执行环境)来调用command_name,但不调用command_name。
command_names以及使用PATH变量(如命令搜索和执行中描述的)找到的任何实现定义的函数,shall应写入为绝对路径名。https://unix.stackexchange.com/questions/496259
复制相似问题