次の状況を考えてみましょう。
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
改行を再追加します。
いずれにせよ、ループを使用することは、while read
通常、間違ったアプローチを取っていることを示します。特にテキスト処理のみの場合にはさらにそうです。