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我们实际使用的程序作为命令后简单地执行,尽管这超出了本问答的范围,但我留下了一个提示:

    command -v ping
    
  • 我选择ping从 Cygwin 卸载该软件包并使用,is_host_online_windows()因为它比 Cygwin 程序更快。

  • 为了完整起见,我包括了is_host_online_linux(),尽管与这个问题无关。

相关内容