在*NIX環境中,內部命令或外部命令(Utility)支持以下三種輸入方式:
1. 命令自己提供的輸入參數,更準確地說是處理的對象,譬如AWK中的文件。不是那些控制參數。
2. 從STDIN輸入。
3. 從文件重定向到STDIN作爲輸入。
對於2,用戶每輸入一行(ENTER鍵結束),程序就輸出它。而3不同,看到重定向操作符,SHELL會將文件的輸入重定向到STDIN中,作爲命令的標準輸入,所以對於程序來說,這個過程是透明的。程序一次性的讀入文件的所有內容作爲輸入,然後處理,不管文件中有多少行。
PIPE(通道)提供了一種方式,將一個程序的STDOUT連接到另一個程序的STDIN,這樣前一個程序的標準輸出,後一個程序的輸入就可以看到。管道連接的2個程序幾乎是同時運行的,區別於&&或","連接的2個程序,而且標準輸出默認是行緩衝輸出的,所以說,前一個程序的一行輸出,在後一個程序中標準輸入中就可以看到一行輸入。
而對於1,這個是程序特別的。程序需要什麼樣的輸入參數,程序自己知道。在*NIX中,標準的輸入是以WHITESPACE作爲分隔符的。一般來說,程序是一個一個參數來處理的,所以程序就可以捎帶N多輸入參數,但是這個是在系統中是有限制的( getconf ARG_MAX)。我們可以通過xargs命令,然後連同PIPE將一個程序的輸出,轉化爲一個標準的參數輸入列表,只要某個程序支持標準的參數列表輸入,那麼用這種方式給程序提供參數輸入就可行。譬如
find . -name '*.pl' | xargs
當查找出來的文件中包含換行符時,我們需要爲find命令加上-print0選項,將每項輸出結尾的\n替換成NULL,然後在xargs命令中採用-0選項來將NULL作爲輸入項的分隔符。這樣就能爭取的得到每項的輸入。xargs默認是以WHITSPACE作爲分隔符。
find ./ -name '*.txt' -print0 | xargs -0 -n 1 cat
同時-print0和-0選項的結合,可以消除文件中包含WHITESPACE的問題。
加入txt文件有2個"a b.txt"和"a.txt", find默認給出一行一個文件的輸出。
$ find ./ -name '*.txt'
./a b.txt
./a.txt
輸入到xargs中,它會默認按照WHITESPACE分隔,比如:
$ find ./ -name '*.txt' | xargs -n 1
./a
b.txt
./a.txt
$ find ./ -name '*.txt' | xargs -n 2
./a b.txt
./a.txt
$ find ./ -name '*.txt' | xargs -n 3
./a b.txt ./a.txt
-n 是將輸入中的多少個項組成一個參數列表。所以如果那 xargs輸出的參數列表來執行其他命令,大多數會失敗,因爲有些項已經被WHITESPACE分隔開了。需要說明的是,有些程序提供了“-” option,支持從標準輸入中獲取輸入參數,譬如AWK程序
awk 'print' a.txt -
先處理a.txt,然後再循環處理標準輸入。