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作成しなければなりませんが、読んでみるとその理由がわかりません。

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

おすすめ記事