对于管道和命令参数不是很清楚

对于管道和命令参数不是很清楚

如:

#rpm -qa | grep samba   (正确用法)

#grep samba `rpm -qa`就不对,也应该不对

在各种书里,都是这样介绍管道:管道 (|) 将一个命令的输出作为另外一个命令的输入。 那么,rpm -qa 命令的输出是什么呢?不是文件名吧?grep的输入要求是文件,那这样岂不是不匹配?请大侠指点!
:confused:      
管道,老外称之为 pipe,翻译的通俗一点儿就是管子。管子的作用大家都很熟悉吧,就说我们的自来水管儿,水从另一端流入,从你家里流出。管子就是起个连接作用,一头儿进,一头儿出。

许多命令从 stdin 读取输入,许多命令将结果输出到 stdout。“command1 | command2”中的管子就是将 command1 的 stdout 跟 command2 的 stdin 连在一起了。      
世界上这么有一种命令,它既可以从文件里读取输入,也可以从 stdin 读取输入。就说 grep 吧,如果你在命令行上既指定了 pattern,又指定了一个 file,那么 grep 就从这个 file 中去寻找那个 pattern;如果你在命令行上只指定了一个 pattern,那么 grep 就到 stdin 中去寻找这个 pattern。
如果一个命令不会从 stdin 读取输入,我们就不能(实际上是不必)把它放到管道后面;道理很简单:如果你家不需要自来水,那么自来水公司也就没有必要拉一根管子到你家去了,当然,拉一根过去倒也没什么大碍。      
看来楼主对输入输出这种文件描述符不是很有概念,有时间搞搞C啦,dearvoid 同志不要怪我拉人哦。      
原本我也想建议他看看 C 语言来着       
晕~~~这个东东跟C有什么关系?我觉得C的精华就在于指针和链表,小弟才刚开始研究shell,一直弄嵌入式了。大虾见笑了。
本来管道的意思我也理解一些,可能不够深刻吧,我是知道,它是一头儿进,一头儿出。可我的意思是:问题恰恰出在这,这端流出的是粪水,另一端需要的是纯净水,这样,总不能随便接吧?我说的不匹配指的就是这个意思。rpm -qa 输出是“查询到系统已经安装的rpm包”这个out怎么能接入 grep samba呢?难道说这个grep,不管是什么输入都可以?用man grep看了看,也不是很理解      
rpm -qa 输出到 stdout 上,grep samba 从 stdin 获取输入,这种情况恰好可以用管道把他们连接起来:rpm -qa | grep samba      
有时候管道两边的命令可以是不相干的

比如:sleep 3|sleep 3

rpm -qa|grep samba ,这个应该很好理解吧?