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 / 问题 / 558636
Accepted
testter
testter
Asked: 2019-12-24 08:36:48 +0800 CST2019-12-24 08:36:48 +0800 CST 2019-12-24 08:36:48 +0800 CST

Bash printf格式化不起作用

  • 772

例如,\c格式不起作用。我输入printf "ABC\ctest"bash 控制台和结果;

ABC\ctest

考虑到\c格式的属性,预期的输出应该是ABC.

我也没有找到详细说明在 bash 上使用 printf 命令的适当来源。此外,如上例所示,为 printf 命令指定的手册页上的属性无法正常工作。

请给我看一个关于 bash 的源代码,它详细解释了 printf 命令。因为我现在很迷茫。

bash printf
  • 2 2 个回答
  • 2754 Views

2 个回答

  • Voted
  1. Best Answer
    JdeBP
    2019-12-24T11:16:13+08:002019-12-24T11:16:13+08:00
    printf 'ABC\ctest'

    您遇到了printf命令的未指定部分之一,其行为因实现而异。你放\c错地方了。

    如果您仔细阅读Single Unix Specification的描述printf,您会发现它\c没有列在为格式字符串(命令的第一个参数)定义的转义序列列表中。相反,它被定义为一个额外的转义序列,当在要由格式说明符格式化的参数字符串中给出时,该转义序列被识别。%b

    换句话说:

    • printf '%b\n' 'ABC\ctest'具有明确指定的行为。这\c会导致所有剩余的内容(包括格式字符串中的换行符)都被忽略。
    • printf '%s\n' 'ABC\ctest'具有明确指定的行为。这\c首先不是转义序列。
    • printf '\c'没有明确的行为。SUS只是对是什么保持沉默,\c没有将其列为转义序列,也没有在其文件格式符号部分中说这样的序列绝不是转义序列。

    不同的 shell 响应这种不符合格式的字符串的行为差异很大。以下是 Debian Almquist、Bourne Again、FreeBSD Almquist、Korn '93 和 Z shells 的反应(%s 显示没有发出换行符的位置):

    %破折号 -c "p​​rintf 'ABC\ctest\n'"
    ABC\ctest
    % bash -c "p​​rintf 'ABC\ctest\n'"
    ABC\ctest
    % sh -c "p​​rintf 'ABC\ctest\n'"
    ABC%
    % ksh93 -c "p​​rintf 'ABC\ctest\n'"
    ABCest
    % zsh -c "p​​rintf 'ABC\ctest\n'"
    ABC%
    %
    

    我拥有的 MirBSD Korn 和 PD Korn shell 的构建没有printf内置命令。FreeBSD 非内置的printf这样做:

    % /usr/bin/printf 'ABC\ctest\n'
    ABC%
    %
    

    更有趣的是,各种贝壳的 doco 有时具有高度误导性,有时甚至是完全错误的。举些例子:

    • Z shell doco最近才开始给出正确的描述\c,并将其(通过其 doco for echo)列为格式字符串中允许的转义序列。(在2017 年之前它是不正确的,doco 既不同意SUS,也不描述 Z shell 的实际作用。)
    • Korn '93 shell doco 给出了与SUS一致的描述,但它不是(如前面所见)它\c在格式说明符中的实际作用。它也将文档\c作为格式字符串的转义序列。它的行为显然是一个错误。
    • Bourne Again shell的 doco和Debian Almquist shell 的 doco给出了与SUS\c匹配的描述,并明确列出了与(在 Bourne Again shell 的情况下,比现在直到 2016 年更清楚)和不在格式说明符的一般转义序列列表中。这些 shell 不提供此作为标准的扩展。%bprintf
    • FreeBSD Almquist shell doco 遵循FreeBSD 外部printf命令手册,其描述\c与SUS一致。它明确将其列为格式字符串中允许的转义序列,其实际行为如用户手册中所述。

    FreeBSD Almquist shell 和(最近的)Z shell 是唯一的 shell,在这里,它们都允许\c作为格式字符串中的转义序列(标准定义的扩展)并且实际上按照它们记录的方式运行。

    讽刺的延伸阅读

    • 为什么 printf 比 echo 好?
    • 9
  2. Paulo Tomé
    2019-12-24T09:00:37+08:002019-12-24T09:00:37+08:00

    有必要在相应的参数中扩展反斜杠转义序列。如此处所述:

    \c  Terminate output similarly to the \c escape used by echo -e. printf produces no additional output after coming across a \c escape in a %b argument.
    
    $ printf "%b\n" "ABC\chi"
    ABC
    
    • 5

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

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