ping
のすべての出力なしで、ネットワークステータスを監視する簡単なスクリプトを記述しようとしています。
ping -q -c 1 google.com > /dev/null && echo online || echo offline
問題は、接続していないときでも出力にエラーメッセージが表示されることです。
ping: unknown Host google.com
offline
このエラーメッセージを出力から除外するにはどうすればよいですか?
実行すると:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
基本的に、ストリーム1の出力(つまり、stdout
)を/dev/null
にリダイレクトするだけです。
これは、プログラムの通常の実行によって生成された出力をリダイレクトする場合に問題ありません。ただし、すべてのエラー、警告、または失敗によって発生した出力もリダイレクトする場合は、stderr
または標準エラーストリームを/dev/null
にもリダイレクトする必要があります。
これを行う1つの方法は、リダイレクト演算子にリダイレクトするストリームの番号を>
のように付加することです:Command 2> /dev/null
したがって、コマンドは次のようになります。
ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline
ただし、すでに1つのストリームを/dev/null
にリダイレクトしていることに注意してください。同じリダイレクトで単に便乗しないのはなぜですか? Bashでは、リダイレクト先のストリーム番号を指定することでこれを行うことができます。 2>&1
。
リダイレクト演算子の後の&
文字に注意してください。これは、次に表示されるものがファイル名ではなく、出力ストリームの識別子であることをシェルに伝えます。
ping -q -c 1 google.com > /dev/null 2>&1 echo online || echo offline
リダイレクト演算子には注意してください。その順序は非常に重要です。間違った順序でリダイレクトすると、予期しない結果が生じます。
完全な無音を実現するもう1つの方法は、次のショートカットを使用してall出力ストリームを/dev/null
にリダイレクトすることです:&>/dev/null
(または&>/path/to/file.log
でログファイルにリダイレクトする)。
したがって、コマンドは次のように記述します。
ping -q -c 1 google.com &> /dev/null && echo online || echo offline
両方の標準出力(>
または1>
)および標準エラー(2>
):
ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline
または、一方を他方にリダイレクトします。
ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online
$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline
ping
の実装によっては、1つのカウントに制限される場合があります-c 1
。一部の実装ではこれを下回ることができますが、基本的に、不正なルックアップがタイムアウトするまで待機する必要があります。したがって、ping
を使用する代わりに、fing
を使用することもできます。
pingの失敗の遅さ
$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014
$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014
fingの方がはるかに速く失敗します
$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014
$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014