Linux中的管道相关知识
1.Linux管道
在Linux中将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成叫做管道,通过|来进行连接。
1.1 管道的使用
比如下图的小栗子,通过指令ls -l /etc查看etc目录下的所有文件我们发现有1408个文件很多
此时我们通过ls -l /etc | more将ls -l /etc的结果作为下一个指令more的输入结果,此时我们可以看到将茫茫多的文件分割成了好多屏,阻塞后续的输出,通过空格进行查看下一屏的内容。这是管段的简单应用,将两个或多个指令组合起来使用。
1.2 管道使用中存在的问题
再进行个小栗子,设置临时变量temp的值为1,打印出来temp的值返回结果是1,将((temp++))执行自增操作,打印结果为2,那么将((temp++))执行自增操作的输出结果作为echo $temp的输入形成管道时,我们可以看到返回的结果不是3还是2,这又是因为什么呢?
原因是Linux系统中创建管道,是先开辟子进程进行,比如两个指令形成管道,就会先开辟出两个新的子进程给这两个指令,最后返回数据则是返回到主进程中。
但有时候也会因为优先级先后的顺序出现让我们意外的情况,通过下面的栗子更能形象的知道这一点,其中echo $$为打印当前的进程id,echo $BASHPID也是打印当前进程的id,通过第一幅图我们可以知道,无论输出多少遍,在我们的主程序没有手动关闭重启的情况下,主程序的id号是不会发生变化的。
当查看主线程id的指令和more指令形成管道时,我们发现$$输出的结果不会发生变化(不是说首先会开辟两个新的进程然后管道前后指令一人一个的吗?为啥我没有。。。),而$BASHPID和more指令形成管道后就能正常的变化(符合开辟新的线程然后将新的线程显示给more,所以会一会变化)。
原因是$$指令的优先级大于管道指令|,所以在形成管道后$$会先执行然后将结果放在那和more再形成管道,所以一直是显示主进程的id;而$BASHPID的优先级是普通变量的优先级,低于管道指令|,所以能够正常使用在新开辟的进程中和more形成管道,结果也自然就会发生变化。
- 点赞
- 收藏
- 关注作者
评论(0)