考虑下面执行的bash命令。
用于man xargs
的参考
-t,--在执行之前,在标准错误输出上详细地打印命令行。
# `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
的情况下,我才能实现相同的结果?为什么printf
只在xargs
中这样做?
发布于 2018-09-28 21:29:49
问题1
打印命令时,xargs
省略引号。它应该写上:
printf "%q " "meeny miny moe"
如果没有引号,你就会:
printf %q meeny miny moe
(请注意两个空格字符)
问题2
1)和2)中的printf %q
输出是不同的,但它们都是正确的。
不同之处在于,在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
https://stackoverflow.com/questions/52562747
复制相似问题