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

Sin*_*osh 15 bash xargs

在许多情况下,我使用命令替换而不是xargs. 例如rm $(ls)ls | xargs rm

它们之间的真正区别是什么?

我认为差异之一是命令替换在子shell中xargs运行,而在当前shell中运行,但我不确定。

请列出差异。

use*_*001 10

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

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

第三个问题是 globs 被扩展了,所以如果文件名中有星号或问号,会出现意想不到的结果。

你可以在这里找到关于这个问题的很好的讨论:http : //mywiki.wooledge.org/ParsingLs

正确的语法是

echo rm *
Run Code Online (Sandbox Code Playgroud)

或者如果你必须使用 xargs,

find . -maxdepth 1 -print0 | xargs -0 echo rm
Run Code Online (Sandbox Code Playgroud)

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