從右邊向左重定向到程式碼區塊

從右邊向左重定向到程式碼區塊

考慮這種情況:

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)可以在 、 中工作yashwhile ...; 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循環通常表示您採用了錯誤的方法,特別是如果它只是用於文字處理。

相關內容