AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 496259
Accepted
Kusalananda
Kusalananda
Asked: 2019-01-24 08:38:50 +0800 CST2019-01-24 08:38:50 +0800 CST 2019-01-24 08:38:50 +0800 CST

对 yash shell 中的 printf 是否是内置命令有点困惑

  • 772

根据其手册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
posix printf
  • 2 2 个回答
  • 1225 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2019-01-24T10:46:17+08:002019-01-24T10:46:17+08:00

    yashShell确实printf具有并且确实使用了(和其他实用程序)的内置版本。它恰好在制定command -vandtype命令的结果的方式上非常符合 POSIX 标准。

    正如 mosvy 评论一样,POSIX 标准要求常规内置命令可用作$PATH要执行的内置版本的命令的外部命令。

    这是标准中的相关文本:

    命令搜索和执行

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

    1. 如果命令名称不包含任何 <slash> 字符,则将出现以下顺序中的第一个成功步骤:

      • 一个。如果命令名称与特殊内置实用程序的名称匹配,则应调用该特殊内置实用程序。

        [...]

      • e. 否则,应使用 XBD 环境变量中描述的 PATH 环境变量搜索命令:
        • 一世。如果搜索成功:
          • 一个。如果系统已将该实用程序实现为常规内置函数或 shell 函数,则应在路径搜索的此时调用它。
          • 湾。否则,shell 在单独的实用程序环境中执行实用程序 [...]
            [...]
        • ii. 如果搜索不成功,命令将失败,退出状态为 127,并且 shell 将写入错误消息。
    2. 如果命令名称包含至少一个 <slash>,[...]

    这意味着 的输出command -v printf表示在搜索路径中printf找到了该命令,而 的输出添加了该命令是常规内置命令。type printf

    由于printf在搜索路径中找到了该命令,并且由于它是 shell 中的常规内置命令,yash因此将调用其内置版本的命令。如果在路径printf中找不到,并且yashshell 以 POSIX-ly 正确模式运行,则会生成错误。

    yash以成为一个非常符合 POSIX 的外壳而自豪,如果我们看看POSIX 所说command -v的话,这也是正确的:

    -v

    将字符串写入标准输出,指示 shell 将使用的路径名或命令,在当前 shell 执行环境(请参阅shell 执行环境)中调用command_name,但不调用command_name。

    • 实用程序、常规内置实用程序,command_names包括一个<slash>字符,以及使用该PATH变量找到的任何实现定义的函数(如命令搜索和执行中所述),应写为绝对路径名。
    • 15
  2. JdeBP
    2019-01-24T10:55:40+08:002019-01-24T10:55:40+08:00

    Watanabe shell 具有三种内置函数,在其手册中有详细描述。所有的内置命令也都列在那里,但是人们必须从没有任何说明该命令是“特殊”或“半特殊”的注释中推断出某些东西是“常规”内置命令内置。常规内置插件未标记。

    printf是一个这样的“常规”内置。在本机模式下,无论是否找到该名称的外部命令,它总是被调用。

    $ PATH=/usr/bin 
    $ printf
    printf:这个命令需要一个操作数
    $类型 printf
    printf:/usr/bin/printf 中的常规内置
    $
    $ PATH=/ 
    $ printf
    printf:这个命令需要一个操作数
    $类型 printf
    printf:一个常规的内置函数(在 $PATH 中找不到)
    $
    

    但是当posixly-correct设置了 shell 选项时,如果外部命令可以在PATH.

    $设置 --posixly-正确
    $
    $ PATH=/usr/bin 
    $ printf
    printf:这个命令需要一个操作数
    $
    $ PATH=/ 
    $ printf
    yash:没有这样的命令“printf”
    $
    

    这实际上符合单一 Unix 规范所说的,并且至少从 1997 年就已经说过了。

    它不同于 Z shell、93 Korn shell、Bourne Again shell 和 Debian Almquist shell,它们都没有实现或记录常规内置程序的这种行为。例如,Z shell在搜索. PATHDebian Almquist shell 也是如此。这就是这些 shell 所做的一切,即使调用sh它们的开启 POSIX 选项也是如此。

    % /bin/exec -a sh zsh -c "PATH=/ ; 键入 printf ; printf"
    printf 是一个内置的shell
    zsh:printf:1: 没有足够的参数
    % /bin/exec -a sh ksh93 -c "PATH=/ ; 键入 printf ; printf"
    printf 是一个内置的shell
    用法: printf [ options ] 格式 [string ...]
    % /bin/exec -a sh bash --posix -c "PATH=/ type printf ; printf"
    printf 是一个内置的shell
    printf:用法:printf [-v var] 格式 [参数]
    % /bin/exec -a sh dash -c "PATH=/ ; 键入 printf ; printf"
    printf 是一个内置的shell
    sh: 1: printf: 用法: printf 格式 [arg ...]
    %
    

    但是,不运行printf时不运行PATH是 PD Korn shell、Heirloom Bourne shell 和 MirBSD Korn shell 的行为;因为他们一开始就没有printf内置的。☺

    % /bin/exec -a sh `command -v ksh` -c "PATH=/ ; type printf ; printf"
    找不到 printf
    sh:printf:未找到
    % /bin/exec -a sh `command -v oksh` -c "PATH=/ ; type printf ; printf"
    找不到 printf
    sh:printf:未找到
    % /bin/exec -a sh `command -v jsh` -c "PATH=/ ; type printf ; printf"
    找不到 printf
    sh:printf:未找到
    % /bin/exec -a sh mksh -c "PATH=/ ; 键入 printf ; printf"
    找不到 printf
    sh:printf:未找到
    % ksh -c "类型 printf ; printf"
    printf 是 /usr/bin/printf 的跟踪别名
    用法:printf格式[参数...]
    % oksh -c "类型 printf ; printf"
    printf 是 /usr/bin/printf 的跟踪别名
    用法:printf格式[参数...]
    % jsh -c "类型 printf ; printf"
    printf 被散列(/usr/bin/printf)
    用法:printf格式[参数...]
    % mksh -c "类型 printf ; printf"
    printf 是 /usr/bin/printf 的跟踪别名
    用法:printf格式[参数...]
    $
    
    • 6

相关问题

  • 从什么时候开始 POSIX 和 GNU rm 不删除 /?

  • 如何在 POSIX shell 脚本中创建算术循环?

  • 处理最后一个命令的退出代码的正确方法是什么?

  • 当会话负责人退出时,unix 会话会发生什么?

  • 如何使用 Bash 内置的“printf”在源中包含颜色的列中输出?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve