snmpstatusコマンドを使用する場合、「Timeout: ...」を含むすべての端末出力を変数にリダイレクトします。

snmpstatusコマンドを使用する場合、「Timeout: ...」を含むすべての端末出力を変数にリダイレクトします。

最新の Arch Linux で bash 5.0.007-1 と net-snmp 5.8-2 を実行しています。

この行はデバイスのステータスを収集します。

snmpstatus -c public -v1 192.168.1.240

デバイスの電源がオンになっていない場合、つまり上記の IP アドレスがネットワーク上に存在しない場合、上記のコマンドはターミナルに以下の出力を返します。

Timeout: No Response from 192.168.1.240

このタイムアウト出力行がターミナルに表示されるのを停止し、代わりに変数にキャプチャするにはどうすればよいですか。また、デバイスの電源がオンになっていて IP アドレスが存在する場合は、出力が同じ変数に渡されるだけでなく、通常の出力がターミナルに表示される必要があります。

変数を取得したら解析し、その内容に応じて何を行うかを決定します。

(リダイレクトについてはman snmpcmd、、などかなりの量の資料を読みましたが、解決策がわかりません)。man smnpwalk

答え1

私はそれを理解しました。私が経験した主な問題は、コマンドの出力をパイプした後にリダイレクトを行ったためでした。

snmpstatus -c public -v1 192.168.1.240

かなり長いワンライナーの最後に、grep してから sed を実行します。当時は、stderr または stdout のリダイレクトは、関連するコマンドの直後に実行する必要があることに気付いていませんでしたが、今では非常に明白です。これは重要です。なぜなら、私は実際に解決策を見つけ、パイプの最後でリダイレクトしようとしたため、奇妙に機能しないとしてそれを破棄したからです。

stderrを変数にリダイレクトする方法は次のとおりです。

error=$(snmpstatus -c public -v1 192.168.1.240 2>&1)
echo $error

構文の説明は次のとおりです 0 = stdin 1 = stdout 2 = stderr > = redirect

したがって、2>1 は stderr を stdout にリダイレクトすることを意味します。& は必須なので2>&1記述する必要がありますが、私が読んだ限りではその理由はわかりませんでした。

このスタックオーバーフロー答えとても役に立ちました。リダイレクトに関する非常によく書かれたページ

関連情報