次のシナリオを考えてみましょう。
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 シェルの機能です。zsh や bash でも利用できます。rc
派生版ではfish
プロセス置換もサポートされていますが、構文が異なります。一方、yash シェルでは<(...)
異なる機能の構文です。プロセスリダイレクト。
その文言は構文エラー: 予期しないリダイレクトエラーは、シェルがAlmquistシェルの派生であることを示していますdash
。私の知る限り、プロセス置換またはプロセスリダイレクトあらゆる派生物に追加されていますash
。
while ...; done <(cmd)
は では動作しyash
、while ...; done < <(cmd)
は AT&T ksh、zsh、bash でも動作しますが、いずれも標準sh
構文ではなく、 では動作しませんdash
。
dash
(または任意のsh
実装)では、 が必要になりますcmd | while ...; done
が、 ではdash
、 while ループがサブシェルで実行されることに注意してください。
次のようにすることができます:
while ...; done << EOF
$(cmd)
EOF
ただし、出力全体cmd
(少なくともすべての NUL 文字dash
とすべての末尾の改行文字を除去)がメモリに保存され、余分な改行文字が 1 つ追加されることに注意してください。
いかなる場合でも、ループを使用することはwhile read
、多くの場合、間違ったアプローチを取っていることを示しています特にテキスト処理のみの場合。