“xargs”和命令替换之间的区别?

“xargs”和命令替换之间的区别?

在很多情况下,我使用命令替换代替xargs。例如,rm $(ls)ls | xargs rm

它们之间到底有什么区别?

我认为其中一个区别是命令替换在子 shell 中运行,而xargs在当前 shell 中运行,但我不确定。

请列出差异。

答案1

一个区别是,当使用命令替换而不是管道时,传递的数据大小受命令缓冲区大小的限制,因此在某些情况下它会被截断而不会发出警告。这也意味着必须生成整个命令输出并将其存储在内存中,然后才能将其传递给下一个命令,因此对于较大的输出,您可以使用比必要更多的内存。

第一种方法的另一个问题是输出按空格分割,因此您无法处理包含空格的文件名。xargs也受空格问题的影响,但可以通过更改使用的分隔符来解决。 顺便说一句,要正确处理文件名,您需要在第二个示例中使用空字节作为分隔符。

第三个问题是,globs 被扩展,因此如果文件名称中有星号或问号,就会出现意外结果。

您可以在这里找到有关此问题的精彩讨论:http://mywiki.wooledge.org/ParsingLs

正确的语法是

echo rm *

或者如果你必须使用 xargs,

find . -maxdepth 1 -print0 | xargs -0 echo rm

echo当输出看起来正确时删除。

相关内容