サブシェルなしでbashのコマンドの出力を反復する


9

サブシェルを作成したり、一時ファイルを使用したりせずに、コマンドの出力をループしたい。

私のスクリプトの最初のバージョンはこのように見えましたが、サブシェルを作成するため、これは機能しません。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')

そのコマンドの出力を一時ファイルに保存し、一時ファイルでリダイレクトを使用することもできましたが、それを避けたかったのです。

では、リダイレクトによってエラーが発生するのはなぜですか。また、一時ファイルを作成する以外のオプションはありますか?


回答:


13

を逃しました<。する必要があります:

while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')

<(sysctl -a 2>/dev/null | grep '\.rp_filter')ファイルであると考えてください。


どうもありがとう。私の啓発のために、これを文書化しているマニュアルページ、ヘルプ、またはWebページに私を向けることができますか?これを検索しようとしているときに、Googleに便利なものを指示することができませんでした。
Zoredache

2
Googleの「プロセス置換」。例tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB
dogbane

<()置換ではファイル記述子を使用し、一部のオペレーティングシステムでは一時ファイルを透過的に作成して使用することに注意してください。
ewindisch、2011年

@Zoredache:<(bashマニュアルで検索するだけです(「プロセス置換」の下にあります)。
ジル 'SO-邪悪なことをやめる'

@ewindisch、ツールが透過的に問題のない一時ファイルを作成する場合、手動で作成する必要はありませんでした。
Zoredache

0

誰かが再びここに来た場合のいくつかの代替案について...

シェルに応じて、あなたはおそらく使用することができますset -o errexit(サブシェルを含む)コマンドがでトラップされることなく、非ゼロを終了すると、親シェル出口を持つようにifブロックまたは末尾&&||のように、

/bin/false || echo "ignoring error"

または、サブシェルにkillと$ PPID環境変数(使用可能な場合)を使用して親にシグナルを送信させることもできます。

または、whileブロックを関数に移動して0/1を返し(whileブロックの後に明示的に0を返す)、パイプラインをのように実行することもできますsysctl | grep | function || exit。リターンもインラインブロックに入れることができると思いますが、関数はあなたの友達です。;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.