在很多情况下,我使用命令替换代替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
当输出看起来正确时删除。