为什么有时候不能用管道符只能用xargs?
要理解为什么有时不能直接使用管道符(|
),而必须使用 xargs
,我们需要明白管道、标准输入和命令如何接收输入之间的区别。
管道符(|
)
- 管道符用于将一个命令的标准输出(stdout)直接传递给另一个命令的标准输入(stdin)。
- 它非常适用于将数据从一个命令传递到另一个命令,但前提是第二个命令能够从标准输入中读取数据。
标准输入(stdin)
- 标准输入通常是从键盘获取输入,但也可以通过管道从其他命令获取输入。
- 当使用管道时,前一个命令的输出成为后一个命令的输入。
xargs 的作用
xargs
能够将标准输入数据(通常是文本行)转换为命令行参数。- 这在后续的命令不从标准输入读取数据,而是需要命令行参数时特别有用。
为什么有时需要 xargs
有些命令不会从标准输入读取数据,而是期望从命令行参数中获取数据。在这种情况下,即使使用管道,数据也不会被正确处理,因为它们没有被传递为命令行参数。这就是 xargs
发挥作用的地方。
示例
假设我们有一个文件列表,并且我们想要删除这些文件。我们可以先用 find
命令找到这些文件,然后用 rm
命令删除它们。
- 直接使用管道尝试删除文件:
find . -name
"*.tmp"
|
rm
这个命令不会工作,因为rm
需要文件名作为命令行参数,而不是从标准输入读取。 - 使用
xargs
来删除文件:find . -name
"*.tmp"
| xargs
rm
这里xargs
会接收来自find
命令的输出(即文件名),并将它们作为参数传递给rm
。
总结
- 当需要将管道中的数据作为命令行参数传递给后续命令时,
xargs
是必需的。 xargs
解决了某些命令不能直接从标准输入读取数据的问题,它将标准输入转换为命令行参数的形式。