是否有人可以解釋這兩個while循環的區別:While循環 - 進程替換與此字符串命令替換
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
是否有人可以解釋這兩個while循環的區別:While循環 - 進程替換與此字符串命令替換
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
while read test; do
echo $test
done <<< "$(seq 5)"
執行seq 5
,將結果收集到一個臨時變量中。然後執行while循環,爲其提供收集結果。
while read test; do
echo $test
done < <(seq 5)
建立一個子shell執行seq 5
並連接其stdout
到stdin
。然後啓動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
,差異將更加清晰。 <<<"$(...)
窗體將使用更多的內存來存儲臨時字符串。
基於我認爲,唯一的不同之處在於流程替換會代表一個命名管道,例如/dev/fd/63
作爲輸入文件,而<<< ""
將在內部發送輸入,就像讀取緩衝區一樣。當然,讀取輸入的命令是在另一個進程上,如一個子shell或另一個二進制文件,然後它會像管道一樣發送給它。有時在Cygwin中不可能使用process substitution
的環境中,here documents
或here strings
以及command substitutions
更有幫助。
如果你這樣做echo <(:)
你看到在其他字符串輸入的過程替換概念的區別。
進程替代更多的是表示一個文件,而在這裏字符串更多的是在緩衝區中發送輸入。
你有沒有看過'man bash'? – paxdiablo