POSIX方法

POSIX方法

ping私はこのコマンドがcygwinから常にゼロ終了コードを返すことに気づきました。

私はパッケージとしてインストールしましたping

実際の出力:

$ ping 192.168.0.102 -c 1
PING 192.168.0.102 (192.168.0.102): 0 data bytes
36 bytes from 192.168.0.11: icmp_type=3 (Dest Unreachable) icmp_code=1

----192.168.0.102 PING Statistics----
1 packets transmitted, 0 packets received, 100.0% packet loss

vlastimil@vb-nb-windows ~
$ echo $?
0

予想出力:

$ echo $?
1

このパッケージには、質問で説明されているように動作するping非標準バージョンのコマンドが含まれています。ping

このパッケージをアンインストールしてインストールしようとしましたが、コマンドinetutilsがないようですping

この問題をどのように解決できますか? (包装紙等)

編集1:

移植性のために、答えはPOSIXで書かなければなりません。すみません、忘れました。

答え1

POSIX方法


Cygwin固有の方法(ラッパー)

# Using ping utility from ping package
# This utility seems to always return 0 exit code
is_host_online_cygwin()
{
    ping_output_raw=$(ping "$1" 64 1)
    ! echo "$ping_output_raw" | grep 'Dest Unreachable' > /dev/null 2>&1
}

Windows固有の方法(ラッパー) [コンテスト優勝者]

# Using built-in ping utility
# This utility seems to always return 0 exit code
is_host_online_windows()
{
    ping_output_raw=$(ping -n 1 "$1")
    ! echo "$ping_output_raw" | grep 'Destination host unreachable' > /dev/null 2>&1
}

Linux固有の方法(直接)

# Using ping utility from iputils-ping package
# This utility returns the right exit code, there is no need for a wrapper
is_host_online_linux()
{
    ping -c 1 "$1" > /dev/null 2>&1
}

ノート

  • 私はこのソリューションがこれまで理想的ではないことを知っていますが、うまくいきます。

  • これらの機能は、実際にコマンドとして使用するプログラムが何であるかを見つけた後に簡単に実行できますping。たとえこのQ&Aの範囲外の内容ですが、ヒントを差し上げます。

    command -v ping
    
  • 私はpingこのパッケージをCygwinから削除し、is_host_online_windows()Cygwinプログラムよりも速いので使用することにしました。

  • is_host_online_linux()この質問には関係ありませんが、完全性のために含まれています。

関連情報