小鳥初學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切換目錄這種內建命令,也就不會對當前環境造成影響。所以在使用管道符的時候,要規避使用內建命令。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。