サブシェルを作成したり、一時ファイルを使用したりせずに、コマンドの出力をループしたい。
私のスクリプトの最初のバージョンはこのように見えましたが、サブシェルを作成するため、これは機能しません。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')
そのコマンドの出力を一時ファイルに保存し、一時ファイルでリダイレクトを使用することもできましたが、それを避けたかったのです。
では、リダイレクトによってエラーが発生するのはなぜですか。また、一時ファイルを作成する以外のオプションはありますか?