2015-11-19 57 views
4

通過shellcheck.net運行腳本我被告知"for loops over find output are fragile."足夠公平,帶空格的文件名總是很棘手。令人困惑的Bash語法 - 重定向到循環

建議的替換代碼(反正是其中之一)是這樣的:

while IFS= read -r -d '' file 
do 
    #do stuff 
done < <(find . -name '*' -print0) 

我所熟悉的用於輸入文本,從文件到命令<運營商,並明確從find結果被喂入循環。所以,當我第一次看到這個,我認爲這是受害者一些格式化的問題,並試圖「清理」的最後一行。但是,消除< <之間的空白導致語法錯誤一樣,增加一個到<(

那麼什麼是< <(cmd)構造在做什麼?道歉,如果這是一個簡單或多餘的問題,要搜索這些東西並不容易!

回答

5

如您所說,<input redirection

<(Process Substitution

進程替換被支撐在支持命名管道(FIFO)或命名打開的文件的的/ dev/FD方法的系統。它需要的

<(list) 

>(list) 

進程列表的形式與它的輸入或輸出連接到一個FIFO或在的/ dev/FD一些文件中運行。作爲擴展的結果,此文件的名稱作爲參數傳遞給當前命令。如果使用>(列表)表單,寫入文件將爲列表提供輸入。如果使用了<(列表)的形式,作爲一個參數傳遞的文件應該被讀取以獲得列表的輸出。請注意,沒有空間可以在<或>和左括號之間出現,否則結構將被解釋爲一個重定向。

如果可用,與參數和變量擴展,命令替換和算術擴展同時進行處理替代。

因爲那麼它將成爲一個here document令牌不能將二者結合起來<馬克。

您不能在<(之間添加空格,因爲它不再是進程替換令牌。

+0

明白了;所以命令的輸出被髮送到一個文件描述符,並且'<(cmd)'語句被擴展爲該文件描述符名稱。 (現在我有一個術語來搜索是否需要更多信息!) – miken32

+0

是的。例如,請參閱'echo <(echo foo)'和'cat <(echo foo)'。 –

3

A while循環bash是複合命令的一個例子。像其他命令一樣,它有自己的標準輸入。它實際上並沒有從中讀取可言,但是從while環路內的任何命令運行時會從循環繼承它的標準輸入。

在此示例中,read命令將從find命令的輸出中讀取。


<(find ...)進程替換的一個例子。find命令運行,並且<(...)被視爲一個文件,其內容是find命令的輸出。正是這個「文件」while循環(因此read)用於其標準輸入。