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()
この質問には関係ありませんが、完全性のために含まれています。