我刚刚注意到该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
我们实际使用的程序作为命令后简单地执行,尽管这超出了本问答的范围,但我留下了一个提示:command -v ping
我选择
ping
从 Cygwin 卸载该软件包并使用,is_host_online_windows()
因为它比 Cygwin 程序更快。为了完整起见,我包括了
is_host_online_linux()
,尽管与这个问题无关。