[Happy BASH] 關於BASH程序的輸入方式小結

在*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,然後再循環處理標準輸入。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章