考慮這種情況:
diff file.txt <( cat file.txt | grep -v '^\s*#'| sed '/^$/d' )
這是從右到左重定向的範例,其中處理文件並將結果重定向為diff
.已經提出了類似的用例這裡,效果也很好。
但是,嘗試以類似的方式將文件處理結果重新導向到程式碼區塊會失敗:
while read I; do
…
done <( cat $FIL | <do_something_here> )
Syntax error: "(" unexpected
或者,如果你嘗試這樣做:
done < <( cat $FIL | <do_something_here> )
Syntax error: redirection unexpected
如何將某個行程的輸出重新導向到程式碼區塊作為輸入?
答案1
<(...)
流程替代是 Korn shell 的功能。它也可以在 zsh 和 bash 中使用。rc
和衍生物,fish
也有進程替換支持,但具有不同的語法,而在 yash shell 中<(...)
是不同功能的語法:行程重定向。
那個的措辭語法錯誤:意外重定向錯誤表示您的 shell 是 Almquist shell 的衍生版本,例如dash
.據我所知,都沒有流程替代也不行程重定向已被添加到任何ash
衍生品中。
while ...; done <(cmd)
可以在 、 中工作yash
,while ...; done < <(cmd)
可以在 AT&T ksh、zsh 和 bash 中工作,但兩者都不是標準sh
語法,也不能在dash
.
在dash
(或任何sh
實作)中,您需要cmd | while ...; done
,但請注意,在 中dash
, while 迴圈將在子 shell 中運行。
你可以這樣做:
while ...; done << EOF
$(cmd)
EOF
但請注意,它將整個輸出cmd
(至少去除所有 NUL 字元dash
和所有尾隨換行符)儲存在記憶體中(並添加回一個額外的換行符)。
任何狀況之下,使用while read
循環通常表示您採用了錯誤的方法,特別是如果它只是用於文字處理。