xargs中的bash printf转义格式(%q)

时间:2018-09-28 21:15:34

标签: bash shell printf xargs

考虑下面执行的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的情况下会如此?

1 个答案:

答案 0 :(得分:2)

问题1

打印命令时,xargs省略引号。它应该写成:

printf "%q " "meeny miny moe"

没有引号,您得到:

printf %q  meeny miny moe

(请注意两个空格字符)

问题2

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