Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xargs中的bash printf转义格式(%q)_Bash_Shell_Printf_Xargs - Fatal编程技术网

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

xargs中的bash printf转义格式(%q),bash,shell,printf,xargs,Bash,Shell,Printf,Xargs,考虑下面执行的bash命令 有关man xargs的参考信息: -t、 --冗长 在执行之前,在标准错误输出上打印命令行 好的,(2)相当于(3),对我来说都有意义。我有几个问题 问题1 为什么xargs使用-t输出错误的命令:执行此命令会产生与实际xargs执行完全不同的结果?缺少什么,什么xargs没有打印 问题2 为什么(1)中的结果与(2)和(3)中的结果不同?是xargs引用了结果输出,还是printf出于某种原因正在这样做 将%q替换为%s和 echo "meeny miny moe

考虑下面执行的bash命令

有关
man xargs
的参考信息:

-t、 --冗长 在执行之前,在标准错误输出上打印命令行

好的,(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 
结果是不同的,所以我假设它不是引用输出,是不是引用了输出?如何仅使用
printf
而不使用
xargs
来获得相同的结果?为什么
printf
只有在
xargs
中才会这样做?

问题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

sh-c在您的系统上打印“%q”a b c“
输出什么?怎么样
bash-c'printf“%q”abc“
?@melpomene都输出
a\b\c
。内置
printf
与程序
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