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


14

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

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

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

ping: unknown host google.com
offline

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

回答:


28

実行すると:

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

1
ああ&>/dev/null。瞬時に助けてくれてありがとう!
オペラララ14年

4
Be careful with the redirection operators, their order matters a lot.、しかし実際に使用する例は含まれていませんでした2>&1
Izkata 14年

追加するのを忘れていました!例を反映するように回答を編集しました。もう少し時間があれば、順序付けの仕組みについても説明します。
darnir

9

標準出力(>または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

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

失敗ははるかに速い

$ 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

1
私はむしろ使用したいtime手動での時間差を計算するよりも、コマンドをdatetime { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
ルスラン

@Ruslan-おかげで、私はこのようにしてb / cで出力したかったのdateです。IMO、生成された出力を他の人が読むのは簡単です。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.