Linux中的管道相关知识

举报
多米诺的古牌 发表于 2022/02/28 19:29:29 2022/02/28
【摘要】 1.Linux管道在Linux中将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成叫做管道,通过|来进行连接。1.1 管道的使用比如下图的小栗子,通过指令ls -l /etc查看etc目录下的所有文件我们发现有1408个文件很多此时我们通过ls -l /etc | more将ls -l /etc的结果作为下一个指令mor...

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形成管道,结果也自然就会发生变化。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。