美文网首页Shell编程学习笔记
小鸟初学Shell编程(四)管道符

小鸟初学Shell编程(四)管道符

作者: 小林coding | 来源:发表于2019-09-29 21:04 被阅读0次

    管道作用

    管道实际上就是进程之间的一个通信工具,那么用在Linux命令中主要是方便两条命令互相之间可以相互通信。

    管道符

    管道符(匿名管道)是Shell编程经常用到的通信工具。

    管道符是"|",主要是把两个应用程序连接在一起,然后把第一个应用程序的输出,作为第二个应用程序的输入。如果还有第三个应用程序的话,可以把第二个程序的输出,作为第三个应用程序的输入,以此类推。

    ls | grep test.sh,在当前文件过滤出test.sh文件:

    [root@lincoding /]# ls 
    bin   data  etc   lib    lost+found  net   opt   root  selinux  sys    usr
    boot  dev   home  lib64  media       mnt   proc  sbin  srv   test.sh   tmp
    [root@lincoding /]# ls | grep test.sh 
    test.sh
    

    管道符"|"就把ls命令的文件列表输出给到了grep test.sh命令来过滤文件。

    管道符与分号符

    管道符还有一个需要注意的地方,我们可以通过下面的命令观察到,在使用管道符的时候,管道符会为两条命令产生了子进程。

    [root@lincoding /]# cat | ps -f
    UID         PID   PPID  C STIME TTY          TIME CMD
    root       2627   2623  0 14:57 pts/0    00:00:00 -bash
    root      88029   2627  0 19:51 pts/0    00:00:00 cat
    root      88030   2627  0 19:51 pts/0    00:00:00 ps -f
    

    父进程bash的pid为2627,子进程cat的pid为88029,子进程ps -f的pid为88030

    由于管道符是会为连接的命令产生子进程,所以也是不会影响当前环境的。

    我们用cd /home/ | ls命令验证下,运行结果如下:

    [root@lincoding /]# cd /home/ | ls 
    bin   data  etc   lib    lost+found  net   opt   root  selinux  sys    usr
    boot  dev   home  lib64  media       mnt   proc  sbin  srv   test.sh   tmp   
    [root@lincoding /]# pwd
    /
    

    从以上的运行结果可以得知,类似切换目录cd这种会影响当前环境的命令,在使用了管道符之后,就没有对当前环境造成影响了。

    如果使用分号";"连接两条命令会如何呢?

    [root@lincoding /]# cd /sys/ ; ls
    block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
    [root@lincoding sys]# pwd
    /sys
    

    可以得知,通过分号";"连接,cd命令会对当前环境造成影响。


    小结

    分号符和管道符都可以连接两条命令,但是其作用是不同的。
    分号符实际上就是隔开两条命令,第一条执行完,接着执行完第二条,两条命令之间是没有任何关系的。

    管道符的作用是把第一条执行的命令结果传递给第二条命令,同时会为第一条和第二条命令建立子进程,由于命令是在子进程运行的,如果命令有类似cd切换目录这种内建命令,也就不会对当前环境造成影响。所以在使用管道符的时候,要规避使用内建命令。

    相关文章

      网友评论

        本文标题:小鸟初学Shell编程(四)管道符

        本文链接:https://www.haomeiwen.com/subject/fcuqpctx.html