web-dev-qa-db-ja.com

コマンドの出力をリダイレクトする方法は?

pingのすべての出力なしで、ネットワークステータスを監視する簡単なスクリプトを記述しようとしています。

ping -q -c 1 google.com > /dev/null && echo online || echo offline

問題は、接続していないときでも出力にエラーメッセージが表示されることです。

ping: unknown Host google.com
offline

このエラーメッセージを出力から除外するにはどうすればよいですか?

14
operalala

実行すると:

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
28
darnir

両方の標準出力(>または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
9
terdon
$ 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の高速化

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
8
slm