命令
printf 'ABC$def%hx\n' 10 # output: ABC$defa
printf 'ABC$def%s\n' 10 # output: ABC$def10
按预期工作....但我找不到有关 %h 的任何信息。
它在所有系统上都可用吗?
命令
printf 'ABC$def%hx\n' 10 # output: ABC$defa
printf 'ABC$def%s\n' 10 # output: ABC$def10
按预期工作....但我找不到有关 %h 的任何信息。
它在所有系统上都可用吗?
您正在使用
printf
shell 中的命令。在以下情况下,此命令可能具有h
格式长度修饰符:如果你使用 Bash,它将是
printf
内置在 Bash 里面的内置命令。“h”至少在 16 年前就存在了,Bash 2.02
https://github.com/bminor/bash/blame/master/builtins/printf.def#L187
您正在使用
busybox
ash
,那么:“h” 是 17 年前从项目开始时添加的
https://github.com/mirror/busybox/blame/master/coreutils/printf.c#L351
如果你使用 GNU
coreutils
,那么:“h” 是 33 年前添加的
https://github.com/coreutils/coreutils/blame/c41ca2814d2ffad5fff9b9526d1be9eb5366d72d/src/printf.c#L635
有关的信息
h
来自 C 标准:h
printf
1989 年在 C 语言中存在https://port70.net/~nsz/c/c89/c89-draft.html#4.9.6.1h
有关C 编程语言中含义的解释,请查看https://en.cppreference.com/w/c/io/fprintf但是,
h
在以下情况下可能不受支持:使用 Kernel dash shell
printf
内置Ubuntu 默认使用 dash
https://web.git.kernel.org/pub/scm/utils/dash/dash.git/tree/src/bltin/printf.c#n263
使用 FreeBSD
我没有看到提到长度修饰符,除了浮点数的 L
我没有在源代码中看到它https://github.com/lattera/freebsd/blob/master/usr.bin/printf/printf.c#L328
我也测试过了(附注:vagrant 在 freebsd 上是用 Bash 启动的)
macOS
/usr/bin/printf
不支持它,很可能与 BSD 的版本相同并且阅读 POSIX 我没有看到提到长度修饰符:
我说,如果与 Bash 一起使用,它将可用。
但它可能在 Ubuntu 和 BSD 上不可用。我认为 MacOS 无论如何都有 Bash3。
printf "%hjLltzhhhjjjLLLLtttzzzx\n" 10
有趣的事实: Bash 中以下代码的输出是什么?没有
%h
唯一的格式说明符。字母h
用作其后的格式说明符的修饰符%hhx
%hx
%x
%llx
%lx
%zx
%jx
。在 C 编程语言中,所有字母都采用不同的参数类型。有关解释,请参阅https://en.cppreference.com/w/c/io/fprintf中的表格。然而在 shell 中,这根本不重要,所有实现都忽略了此类修饰符。不,
%h
它本身并不是一个标准格式说明符。printf
,h
是一个长度修饰符,而不是一个独立的说明符。例如:printf
(shell)中,行为可能有所不同。alone%h
没有记录,但一些实现可能会意外地解释它