乐趣区

小鸟初学Shell编程四管道符

管道作用

管道实际上就是进程之间的一个通信工具,那么用在 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 切换目录这种内建命令,也就不会对当前环境造成影响。所以在使用管道符的时候,要规避使用内建命令。

退出移动版