Linux命令流水线理解

Linux命令流水线理解,linux,unix,grep,pipelining,Linux,Unix,Grep,Pipelining,我对Linux的枯燥用法有点陌生。我现在正在玩弄管道技术。有谁能告诉我为什么这不起作用: ls | grep 2 | rm (我试图删除名称中包含2的所有文件) ls | grep2部分正在工作(它返回所有文件名,其中包含一个2) 为什么我现在不能通过管道将这些名称发送到rm来删除这些文件 提前感谢您的帮助:)rm需要文件名作为参数,而将文件名发送到rm的标准输入(stdin)。您可以改为: rm $(ls | grep 2) 删除文件。这样,文件名将作为参数传递,而不是传递到rm的标准输入

我对Linux的枯燥用法有点陌生。我现在正在玩弄管道技术。有谁能告诉我为什么这不起作用:

ls | grep 2 | rm
(我试图删除名称中包含2的所有文件)
ls | grep2
部分正在工作(它返回所有文件名,其中包含一个2) 为什么我现在不能通过管道将这些名称发送到
rm
来删除这些文件


提前感谢您的帮助:)

rm
需要文件名作为参数,而将文件名发送到
rm
的标准输入(stdin)。您可以改为:

rm $(ls | grep 2)
删除文件。这样,文件名将作为参数传递,而不是传递到
rm
的标准输入


我已经用你的命令解释了这个问题。一般来说,

同意。这是由于解析ls命令造成的。添加了相关链接。感谢您的回答。但我怎么知道呢?stdin输入和参数在标准终端用例中看起来不一样吗?@ct2034否。它们是不同的。当您在命令名(命令arg1 arg2)后放置一些参数时,它们就是参数。相比之下,管道的输出总是发送到stdin。当与特定参数一起传递时,某些命令能够将stdin解释为参数
-
,例如
echo'| include'| gcc-e-
。但这完全取决于每个命令的实现,无论它们是否支持此功能。请注意,某些命令将允许您通过附加一个破折号作为参数来实现此功能,但是,
rm
恰好不是一个破折号。但是,例如,我可以使用
pacman-Qdqt | sudo pacman-Rns-
在我的Linux上删除不必要的包,这意味着列出所有不必要的包,然后通过管道将它们发送到包管理器,作为要删除的程序。