2013-08-24 116 views

回答

6
while read test; do 
    echo $test 
done <<< "$(seq 5)" 

執行seq 5,將結果收集到一個臨時變量中。然後執行while循環,爲其提供收集結果。

while read test; do 
    echo $test 
done < <(seq 5) 

建立一個子shell執行seq 5並連接其stdoutstdin。然後啓動while循環。完成後,還原stdin

有什麼區別?對於seq 5,幾乎沒有什麼;但是,仍然可以通過將seq 5更改爲seq 5; echo done generating sequence >&2來使其可見。然後可以看到,在第一種情況下,整個seq執行在while循環開始之前完成,而在第二種情況下它們並行執行。

$ while read n; do echo $n > /dev/stderr; done \ 
>  <<<"$(seq 5; echo done generating sequence >&2)" 
done generating sequence 
1 
2 
3 
4 
5 
$ while read n; do echo $n > /dev/stderr; done \ 
>  < <(seq 5; echo done generating sequence >&2) 
1 
2 
done generating sequence 
3 
4 
5 

如果是seq 10000000,差異將更加清晰。 <<<"$(...)窗體將使用更多的內存來存儲臨時字符串。

2

基於我認爲,唯一的不同之處在於流程替換會代表一個命名管道,例如/dev/fd/63作爲輸入文件,而<<< ""將在內部發送輸入,就像讀取緩衝區一樣。當然,讀取輸入的命令是在另一個進程上,如一個子shell或另一個二進制文件,然後它會像管道一樣發送給它。有時在Cygwin中不可能使用process substitution的環境中,here documentshere strings以及command substitutions更有幫助。

如果你這樣做echo <(:)你看到在其他字符串輸入的過程替換概念的區別。

進程替代更多的是表示一個文件,而在這裏字符串更多的是在緩衝區中發送輸入。