对于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需要的是参数,而不是会跑到缓冲区里的标准输入!!!
时间: 2024-10-07 17:43:18