2015-11-23 4 views
7

インターネットにアクセスできるようになったときにこのbashスクリプトに通知するように書いたが、何か起きていることを理解していない。ここではスクリプトです:インターネットにアクセス可能なときに通知するためのBashスクリプト

while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done; 
  • -c 1オプションは、私が唯一のパケットを送信したいpingを伝えます。
  • 出力が見たくないので、2&> /dev/nullがあります。
  • trueがあります。bashdo;の構文を受け入れなかったためです。
  • の前にパケットが受信されない場合、pingがゼロ以外のステータスコードを返すため、終了条件は! ping ...です。

pingが成功し、ターミナルエミュレータから通知が自動的に届いたときに、このループが終了するようになっていました。


問題

  • このコマンドは、インターネットにアクセス可能になっても終わりません。
  • ctrl + Cでコマンドを強制終了しようとすると機能しません。私はコマンド全体の代わりにサブコマンドpingを殺していると思います。
  • 2&> /dev/nullを削除するだけで、端末に出力を書き出すという小さな問題以外はすべて動作します。

私のコマンドを使用して、何が悪いの質問

  1. 端末エミュレータと正確にはどのように反応しますかctrl + C
  2. 2&> /dev/nullを削除すると効果的です

私は既にターンアラウンドがあることに注意してください。それでも、私はもう少し詳しくbashを理解したいです。

f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null 
+1

私のバージョンの 'ping'は' ping -c1 8.8.8.8'を想定しています。あなたの問題を探求するためのPluse-uno!がんばろう。 – shellter

答えて

8

正しいリダイレクトオペレータは&>、ない2&>あります。 2はpingとは別の引数として解析され、pingが2には決して成功しないので、ループは存在しません。私は通常、ループのようなもので行う

+0

*私のせいです。私はこのより冗長な構文 '2>&1'を使用しませんでした。 *あなたは 'Ctrl + C 'の問題について説明しません。 'Ctrl + C 'はループの代わりにpingコマンドを強制終了しますか?なぜなら、あなたの提案( '&>')では、ネットワークが存在しないとき(pingが失敗しているとき)、コマンドはctrl-c-interrupt-ableです。 –

+1

Ctrl + Cは、現在のフォアグラウンドジョブに割り込みを送ります。これは、実際に入力するタイミングに応じて、 'ping'であったり、シェルであったりします。 – chepner

+0

これは実際に起こっていることを説明していません。リダイレクトの問題を修正した後、コマンドはctrl-c-interupptibleになります。あなたは、ほとんどの時間がTTLが切れるのを待つのに費やされることを考慮に入れています。そのため、シェルが実行されているときに私のCtrl + Cが短い瞬間を捉える確率はゼロです。 –

3

何かがsleepコマンドを追加する代わりにtrueさ:

while ! ping 8.8.8.8 -c 1 &> /dev/null ; do sleep 1; done; 

あなたは睡眠中にCtrl+Cしばらく使用し、ループ全体を取り消すことができるようにします。

+0

ありがとうございますが、明らかに、 'while! ping 8.8.8.8 -c 1&>/dev/null;真実を行う;完了しました;は中断可能ですので、私は睡眠を使用する理由は見ません。 'true'も短くなります:p。 –

+0

はい、それほど攻撃的ではありません。 – FJRA

+0

@chepnerレスポンスに対するコメントを参照してください。私は今、スリープ機能の有用性を認識しています。 Ctrl + Cをクリックしたときに実行中のbashの可能性が高くなります。 –

1

もっと良い方法は、pingでタイムアウトを設定することです。

while ! ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1 ; do sleep 1 ; done 
関連する問題