管道作用
管道實際上就是進程之間的一個通信工具,那么用在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
切換目錄這種內建命令,也就不會對當前環境造成影響。所以在使用管道符的時候,要規避使用內建命令。