右から左にコードブロックにリダイレクト

右から左にコードブロックにリダイレクト

次の状況を考えてみましょう。

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)で動作しyashwhile ...; done < <(cmd)AT&T ksh、zsh、bashで動作しますが、標準sh構文でも動作しませんdash

dash(またはすべての実装)にはがsh必要ですcmd | while ...; doneが、dashwhileループはサブシェルで実行されます。

次のことができます。

while ...; done << EOF
$(cmd)
EOF

cmdただし、完全な出力(最小のすべてのNUL文字とすべての末尾の改行を除く)をメモリに保存し、追加のdash改行を再追加します。

いずれにせよ、ループを使用することは、while read通常、間違ったアプローチを取っていることを示します。特にテキスト処理のみの場合にはさらにそうです。

おすすめ記事