您的位置:首页 > 运维架构 > Linux

linux里有关管道符的疑惑

2015-09-02 12:26 363 查看
对于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需要的是参数,而不是会跑到缓冲区里的标准输入!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: