码迷,mamicode.com
首页 > 系统相关 > 详细

linux里有关管道符的疑惑

时间:2015-09-02 13:23:10      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

对于linux的管道符 “|” 我一直有一个疑惑,当我想要使用类似如下命令时总是不能达到我想要的结果:

假设有一个文件:path.txt

里面记录了一个地址:

$ cat path.txt
~/Download/

而我想要把这个地址通过“|”导入到cd或者ls命令中,比如这样:

$ cat path.txt | ls

却总是不能如愿,它并没有列出~/Download里的内容。

 

我经过一番查询,发现了一些东西。

我们平时给ls后面接上的那串东西是参数,而管道符传递给ls的只有标准输入,ls是不会从标准输入里找参数的。

grep能接收标准输入,因此能正确运行类似 ls | grep log.tx t的命令,

 

那么grep与ls区别是什么呢?

这需要分清两样东西:1.参数 2.输入

命令的运行需要我们指定些参数给它,好让它知道它应该怎么运行才能让我们满意。

ls -al
ps -ef
rm -rf

-al -ef -rf都是命令的参数,用来告诉命令它们应该怎么完成任务。

对于 ls | grep log.txt 来说,log.txt就是grep 的参数,参数不能由管道符“|”给出的标准输入提供。

 

grep 从管道符"|"中获得的东西去了哪呢?

答案是管道符的标准输入进入了缓冲区,等待grep里类似scanf()函数读取。

我们可以做个实验,我们在终端输入

$ grep 123

我们会发现程序运行中断了,似乎是在等待我们输入什么,于是输入12345,

结果程序输出了12345,

我们再输入67890,

程序没有输出,看来道理已经很明显了,管道符的标准输入跑到这里来,被grep的类似scanf()的函数读取了。

 

妈妈再也不用担心我的cat path.txt | ls 为什么运行不了了

因为ls需要的是参数,而不是会跑到缓冲区里的标准输入!!!

linux里有关管道符的疑惑

标签:

原文地址:http://www.cnblogs.com/hider000/p/4778240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!