为什么xargs -t不显示引号?

3
假设您通过 ls -Qgrep 打开了两个目录进行搜索。
$ mkdir "example 1"
$ mkdir "example 2"
$ ls -Q | grep example | xargs -t nautilus

然后选项-t会显示没有引号的nautilus example 1 example 2。但是文件夹会被正确打开。

$ ls -Q | grep example | xargs -t echo
echo example 1 example 2 
example 1 example 2

为了完整起见,让我展示一下xargs的输入:

$ ls -Q | grep example
"example 1"
"example 2"

所以引号去哪儿了?

这里发生了什么?引号去哪儿了?


引号从未成为文件名的一部分。运行ls example*命令,你就会明白了。 - devnull
2
运行 ls -Q | grep example 命令,你就能看到 -Q 选项对引号的影响了。 :-) - Anne van Rossum
很好。从来不知道 ls 提供引用条目的选项。 - devnull
是的,一旦你知道了它,这是一个非常方便的标志。 - Anne van Rossum
1个回答

7

xargs 将引号和反斜杠视为特殊字符。如果想要使用引号,则需要对其进行转义。将 grep 的输出传递给 sed 来替你转义引号:

$ ls -Q | grep example | sed 's/"/\\"/g' | xargs echo
"example 1" "example 2"

有趣的是,显然不是nautilus example 1 example 2而是nautilus“example 1”“example 2”被调用,因为它可以在不添加转义引号的情况下正常工作(请参见nautilus示例)。我想知道为什么。 - Anne van Rossum
还要注意ls -Q | grep example | xargs -t -d '\n'不会改变引号。 - Anne van Rossum
我认为这是xargs输出中的一个“bug”:ls -Q | grep example | tr '\n' ' ' | xargs -t nautilus可以正常工作,因此不会秘密地使用新行作为分隔符。然而,ls -Q | grep example | tr '"' ' ' | xargs -t nautilus无法工作。因此,在积极删除(未显示的!)引号时,xargs将失败。 - Anne van Rossum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接