首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >xargs中的bash printf转义格式(%q)

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

Stack Overflow用户
提问于 2018-09-28 21:15:34
回答 1查看 1.7K关注 0票数 1

考虑下面执行的bash命令。

用于man xargs的参考

-t,--在执行之前,在标准错误输出上详细地打印命令行。

代码语言:javascript
运行
复制
# `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

代码语言:javascript
运行
复制
echo "meeny miny moe" | xargs -t -I {} printf "%s " "{}"
printf %s  meeny miny moe
meeny miny moe 

结果是不同的,所以我假设它不是xargs引用的输出,是printf吗?只有在没有printf的情况下,我才能实现相同的结果?为什么printf只在xargs中这样做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 21:29:49

问题1

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

代码语言:javascript
运行
复制
printf "%q " "meeny miny moe"

如果没有引号,你就会:

代码语言:javascript
运行
复制
printf %q  meeny miny moe

(请注意两个空格字符)

问题2

1)和2)中的printf %q输出是不同的,但它们都是正确的。

不同之处在于,在1)中,您使用的是printf可执行文件(可能是在/usr/bin中,而在2)中,您使用的是您的shell提供的printf内置文件。

试一试:

代码语言:javascript
运行
复制
$ 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52562747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档