質問: サブシェルなしでbashのコマンドの出力を反復する サブシェルを作成したり、一時ファイルを使用したりせずに、コマンドの出力をループしたい。スクリプトの初期バージョンは次のようになりましたが、サブシェルが作成され、exitコマンドが必要なメインスクリプトの代わりにサブシェルを終了するため、これは機能しません。これは、ポリシールーティングを構成するためのはるかに大きなスクリプトの一部であり、ルーティングが失敗する原因となる条件を検出すると実行を停止します。sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a rpstat ; do if [[ "0" != "${rpstat[2]}" ]] ; then echo >&2 "rp filter must be disabled on all interfaces!" echo >&2 "the rp filter feature is incompatible with policy routing" exit 1 fi done したがって、推奨される代替策の1つは、このようなコマンドを使用してサブシェルを回避することです。while read blah ; do echo $blah; done </root/regularfile したがって、このようなコマンドを使用してサブシェルを回避し、必要なプログラムから出力を取得できるようにする必要があるように思われます。while read blah ; do echo $blah; done <(sysctl -a 2>/dev/null | grep '\.rp_filter') 残念ながら、そのコマンドを使用すると、このエラーが発生します。-bash: syntax error near unexpected token `<(sysct ... これは機能するので、本当に混乱します。cat <(sysctl -a 2>/dev/null | grep '\.rp_filter') そのコマンドの出力を一時ファイルに保存し、一時ファイルでリダイレクトを使用することはできましたが、そうすることは避けたかったのです。では、リダイレクトによってエラーが発生するのはなぜですか?一時ファイルを作成する以外のオプションはありますか?
回答: _<_を逃しました。する必要があります:_while read blah ; do echo $blah; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter') _<(sysctl -a 2>/dev/null | grep '\.rp_filter')をファイルと考えてください。