回答:
実行すると:
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つの方法は、すべての出力ストリーム/dev/null
をこのショートカットを使用するようにリダイレクトすることです。&>/dev/null
リダイレクトする(または、ログファイルにリダイレクトします&>/path/to/file.log
)。
したがって、コマンドを次のように記述します。
ping -q -c 1 google.com &> /dev/null && echo online || echo offline
Be careful with the redirection operators, their order matters a lot.
、しかし実際に使用する例は含まれていませんでした2>&1
$ 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
失敗ははるかに速い
$ 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
time
手動での時間差を計算するよりも、コマンドをdate
:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
date
です。IMO、生成された出力を他の人が読むのは簡単です。
&>/dev/null
。瞬時に助けてくれてありがとう!