我想知道printf
使用通配符时命令会遵循什么行为。这个问题最初是由其他人问我的,但我自己对这种行为感到困惑,并希望得到一个解释来帮助我理解命令的printf
工作原理。
给定以下目录:
$ ls -a
.a a.b ab.c b .b b.a b.c c c.d d d.e e
$ printf [abcd]*[abcd]
将输出a.b
。$ ls [abcd]*[abcd]
给出
a.b:
ab.c:
b.a:
b.c:
c.d:
作为输出,$ echo [abcd]*[abcd]
结果为a.b ab.c b.a b.c c.d
为什么 printf 的输出不同?这与正则表达式/shell 扩展优先级有关吗?
答案1
使用set -x
来查看 shell 展开后的命令到底是什么。结果
printf [abcd]*[abcd]
在你的目录中实际上是
printf a.b ab.c b.a b.c c.d
现在printf
视为a.b
格式(见man 1 printf
)。它不包含%s
任何类似的东西,这就是为什么其余的参数并不重要并且文字a.b
被打印。
如果您希望printf
表现得更像echo
,您应该指定所需的格式,例如:
printf '%s\n' [abcd]*[abcd]
将打印
a.b ab.c b.a b.c c.d
(注意:测试完成后用于set +x
恢复。)set -x