考虑下面执行的bash命令。
供man xargs
参考:
-t,--verbose 在执行之前,在标准错误输出上打印命令行。
# `printf` (1)
echo "meeny miny moe" | xargs -t -I {} printf "%q " "{}"
printf %q meeny miny moe
'meeny miny moe'
# Then let's try the command output by `xargs`
printf %q meeny miny moe
meenyminymoe
# `printf` (2)
echo "meeny miny moe" | xargs -t -I {} sh -c 'printf "%q " "$@"' -- "{}"
sh -c printf "%q " "$@" -- meeny miny moe
meeny\ miny\ moe
# Then let's try the command output by `xargs`
sh -c printf "%q " "$@" -- meeny miny moe
printf: usage: printf [-v var] format [arguments]
# `printf` (3)
printf "%q " "meeny miny moe"
meeny\ miny\ moe
好,(2)等同于(3),两者对我来说都是有意义的。我有几个问题。
问题1
为什么xargs
用-t
输出了错误的命令:执行此命令会产生与实际xargs
执行完全不同的结果?那里缺少什么,xargs
没有打印出来?
问题2
为什么(1)的结果与(2)和(3)的结果不同?是xargs
单引号输出的结果,还是出于某种原因printf
这样做了?
将%q
替换为%s
和
echo "meeny miny moe" | xargs -t -I {} printf "%s " "{}"
printf %s meeny miny moe
meeny miny moe
结果不同,所以我假设不是xargs
在引用输出,是printf
吗?仅使用printf
而没有xargs
时,如何才能达到相同的结果?为什么printf
仅在xargs
的情况下会如此?
答案 0 :(得分:2)
打印命令时,xargs
省略引号。它应该写成:
printf "%q " "meeny miny moe"
没有引号,您得到:
printf %q meeny miny moe
(请注意两个空格字符)
printf %q
在1)和2)中的输出是不同的,但它们都是正确的。
区别在于1)使用的是printf
可执行文件(可能在/usr/bin
中,而2使用的是shell提供的printf
内置文件。
尝试一下:
$ printf '%q\n' "meeny miny moe"
meeny\ miny\ moe
$ /usr/bin/printf '%q\n' "meeny miny moe"
'meeny miny moe'
$ command printf '%q\n' "meeny miny moe"
meeny\ miny\ moe