linux里有关管道符的疑惑
2015-09-02 12:26
363 查看
对于linux的管道符 “|” 我一直有一个疑惑,当我想要使用类似如下命令时总是不能达到我想要的结果:
假设有一个文件:path.txt
里面记录了一个地址:
而我想要把这个地址通过“|”导入到cd或者ls命令中,比如这样:
却总是不能如愿,它并没有列出~/Download里的内容。
我经过一番查询,发现了一些东西。
我们平时给ls后面接上的那串东西是参数,而管道符传递给ls的只有标准输入,ls是不会从标准输入里找参数的。
grep能接收标准输入,因此能正确运行类似 ls | grep log.tx t的命令,
那么grep与ls区别是什么呢?
这需要分清两样东西:1.参数 2.输入
命令的运行需要我们指定些参数给它,好让它知道它应该怎么运行才能让我们满意。
-al -ef -rf都是命令的参数,用来告诉命令它们应该怎么完成任务。
对于 ls | grep log.txt 来说,log.txt就是grep 的参数,参数不能由管道符“|”给出的标准输入提供。
grep 从管道符"|"中获得的东西去了哪呢?
答案是管道符的标准输入进入了缓冲区,等待grep里类似scanf()函数读取。
我们可以做个实验,我们在终端输入
我们会发现程序运行中断了,似乎是在等待我们输入什么,于是输入12345,
结果程序输出了12345,
我们再输入67890,
程序没有输出,看来道理已经很明显了,管道符的标准输入跑到这里来,被grep的类似scanf()的函数读取了。
妈妈再也不用担心我的cat path.txt | ls 为什么运行不了了
因为ls需要的是参数,而不是会跑到缓冲区里的标准输入!!!
假设有一个文件: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 sysctl.conf中相关重要设定的详细说明
- linux 防火墙
- Linux相关资料
- linux中printk的使用方法
- linux命令:mkdir 命令详解
- centos 一键安装lamp
- Ubuntu Linux 环境变量
- CentOS6 下安装JDK7
- linux中export和source的作用和区别
- linux各个目录下的作用
- 读写linux设备文件
- Linux查看文件列表命令
- centos6.5下安装mysql
- Linux手动创建Swap
- chdir()改变当前工作目录 -- Linux
- chown()改变文件所有者 -- Linux
- linux 清除 arp 缓存
- LinuxDLL加载优化方案
- Linux 之test expr命令
- Linux 文件系统结构介绍