首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于yash shell中的printf是否是内置命令稍微有些困惑。

对于yash shell中的printf是否是内置命令稍微有些困惑。
EN

Unix & Linux用户
提问于 2019-01-23 16:38:50
回答 1查看 1.4K关注 0票数 15

yash外壳有一个内置的printf根据它的手册

但是,我在默认配置的yash shell中看到了这一点:

代码语言:javascript
复制
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

printf在这个外壳中是内置的吗?其结果类似于其他一些被认为是内置的实用程序,这些实用程序也可以作为外部命令使用。

相比之下,在pdksh (ksh on OpenBSD,其中printf不是内置的)中:

代码语言:javascript
复制
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf

bash中(其中printf是内置的):

代码语言:javascript
复制
$ command -v printf
printf
$ type printf
printf is a shell builtin
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-01-23 18:46:17

yash shell确实有并确实使用了内置版本的printf (和其他实用程序)。在制定command -vtype命令的结果时,它恰好是非常符合POSIX的。

作为莫须有的评论,POSIX标准要求在执行命令的内置版本时,常规内置命令在$PATH中可以作为外部命令使用。

这是标准中的相关文本

如果一个简单的命令导致一个命令名和一个可选的参数列表,则应执行以下操作:

  1. 如果命令名不包含任何字符,则将执行以下顺序中的第一个成功步骤:
    • 如果命令名与特定内置实用程序的名称相匹配,则应调用该特殊内置实用程序。
    • 否则,将搜索该命令是否使用XBD环境变量中描述的路径环境变量:。
      • i. If搜索成功:
        • a. If系统已经将该实用程序实现为一个常规的内置或shell函数,它将在路径搜索的此时被调用。
        • 否则,shell将在单独的实用程序环境中执行该实用程序。

代码语言:javascript
复制
    - ii. If the search is unsuccessful, the command shall fail with an exit status of 127 and the shell shall write an error message.
  1. 如果命令名至少包含一个,

这意味着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

  • 实用程序、<#>regular内置实用程序、包含字符的command_names以及使用PATH变量(如命令搜索和执行中描述的)找到的任何实现定义的函数,shall应写入为绝对路径名
票数 15
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/496259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档