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 个回答 Voted 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 "printf 'ABC\ctest\n'" ABC\ctest % bash -c "printf 'ABC\ctest\n'" ABC\ctest % sh -c "printf 'ABC\ctest\n'" ABC% % ksh93 -c "printf 'ABC\ctest\n'" ABCest % zsh -c "printf '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 好? 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
您遇到了
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 显示没有发出换行符的位置):我拥有的 MirBSD Korn 和 PD Korn shell 的构建没有
printf
内置命令。FreeBSD 非内置的printf
这样做:更有趣的是,各种贝壳的 doco 有时具有高度误导性,有时甚至是完全错误的。举些例子:
\c
,并将其(通过其 doco forecho
)列为格式字符串中允许的转义序列。(在2017 年之前它是不正确的,doco 既不同意SUS,也不描述 Z shell 的实际作用。)\c
在格式说明符中的实际作用。它也将文档\c
作为格式字符串的转义序列。它的行为显然是一个错误。\c
匹配的描述,并明确列出了与(在 Bourne Again shell 的情况下,比现在直到 2016 年更清楚)和不在格式说明符的一般转义序列列表中。这些 shell 不提供此作为标准的扩展。%b
printf
printf
命令手册,其描述\c
与SUS一致。它明确将其列为格式字符串中允许的转义序列,其实际行为如用户手册中所述。FreeBSD Almquist shell 和(最近的)Z shell 是唯一的 shell,在这里,它们都允许
\c
作为格式字符串中的转义序列(标准定义的扩展)并且实际上按照它们记录的方式运行。讽刺的延伸阅读
有必要在相应的参数中扩展反斜杠转义序列。如此处所述: