通道符“|“:是將前一個命令的輸出做為后一個命令的標准輸入。注意:這里的標准輸入指的是:通道符右側命令的處理內容,也就是說左側的標准輸出不能作為右側命令的參數,只能作為命令的處理對象。
簡單講:只有通道符時,右側命令將左側輸出作為處理內容。加上xargs后,將左側輸出作為參數。具體看下面wc命令的執行,就明白了。
寫起來都很別扭,理解起來也費勁啊,還是舉例子吧:
1、環境:假設當前目錄下,tesy文件夾內有3個文件,t1.c,t2.c,t3.c
t1.c內容:
hello,I am t1
ok
t2.c內容:
this is t2
t3.c內容:
I am t3
I have 3 lines
look it
然后,我再當前目錄建立一個文件t,內容如下:
t1.c
t2.c
t3.c
最后,我在當前目錄執行: cat t | ls -l
[root@noi ~]# cat t | ls -l total 8 -rw-r--r-- 1 root root 30 Jun 8 12:11 t drwxr-xr-x 2 root root 4096 Jun 8 12:10 tesy
也輸出了內容,和我們的想法不一樣,我們想的是將t文件內的文件列表傳給ls命令,然后一一列出詳細屬性。但是顯然輸出的不對,那么這些到底是怎么運作的呢?
cat t命令產生的標准輸出通過通道符傳給了ls命令,但是ls命令拋棄了,因為ls命令不能處理流,它不是一個文本處理軟件,然后ls獨自運行,因為沒有參數,所以最終執行的命令是:
ls -l
就將當前目錄作為默認參數,顯示出來。
然后運行:
cat t | xagrs ls -l
[root@noi ~]# cat t | xargs ls -l -rw-r--r-- 1 root root 18 Jun 8 12:10 tesy/t1.c -rw-r--r-- 1 root root 11 Jun 8 12:09 tesy/t2.c -rw-r--r-- 1 root root 31 Jun 8 12:09 tesy/t3.c
看到沒?正確執行了我們的意圖。xargs命令將從cat t得到的標准輸出,作為參數傳遞給ls命令,這樣ls命令得到3個參數,最終執行: ls -l t1.c t2.c t3.c
2、如果上題還有疑問,那么wc命令將最終為您解惑:
執行:
cat t | wc -l
wc命令將cat的輸出作為處理內容,進行計算,最終輸出3,表示有3行。
[root@noi ~]# cat t | wc -l 3
執行:
cat t | xargs wc -l
xargs將cat輸出的3行作為wc的參數傳遞進來,於是最終執行: wc -l t1.c t2.c t3.c
[root@noi ~]# cat t | xargs wc -l 2 tesy/t1.c 1 tesy/t2.c 3 tesy/t3.c 6 total
看到沒?wc最終計算的是t1.c,t2.c,t3.c這三個文件,而不是t文件。這就是xargs的作用,將標准輸出轉為命令的參數,而不是命令的處理內容。