なぜ
$ ping -c 4 -W 1 127.0.0.1 | cat
そして
$ ping -c 4 -W 1 1.1.1.1
出力はすぐに印刷されますが、
$ ping -c 4 -W 1 1.1.1.1 | cat
4秒間何も印刷せずにすべての出力を一度に印刷しますか?
最初のコマンドは、期待どおりに成功したpingと他の2つの印刷タイムアウトを印刷します。
答え1
シェルパイプラインへのping出力の場合、バッファリングによって異なる動作を説明できます。 pingは正常に受信された各エコーパケットを報告した後にfflush()を呼び出すため、ラインはすぐにcatに送信され、すぐに出力されます。 ping本当にいいえfflush()はタイムアウトパケットを報告する行を作成した後に呼び出されるため、stdioはpingがexit()を呼び出すまでその行をバッファリングし、すべての行をcatに送信して出力します。
端末に直接 ping 出力を行う場合、stdio ラインはデフォルトで ttys に関連付けられたストリームにすべての出力をバッファリングするので、成功および失敗出力がすぐに表示されます。したがって、各出力ラインはstdioによってバッファリングされるのではなく、ただちに端末に転送されます。
精神的に人に釣り方を教える、OS Xを読んで確認することができます。pingのソースコードそしてOS Xを読むstdio マンページ。
答え2
私はこれがcatが入力を取得する方法によるものだと思います。最初のコマンドは終了ステータス 2 を提供し、ping される IP アドレスは終了ステータス 0 を提供します。
つまり、cat は STDOUT の出力を直ちに表示しますが、STDERR をバッファに入れ、コマンドが終了すると表示します。
答え3
DNSまたはICMPエコー応答パケットを待っています。 DNSの場合は、その-n
オプションを試してください。そうでない場合は、ICMPエコー要求に応答するホストとそうでないホスト(またはその応答が途中でフィルタリングされている)を区別してみてください。