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