ping command sempre retorna o código de saída zero no cygwin

3

Acabei de notar que o comando ping sempre retorna zero código de saída no cygwin.

Eu instalei como um pacote ping .

Saída real:

$ 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

Resultado esperado:

$ echo $?
1

Este pacote ping contém uma versão não padrão do comando ping , que obviamente se comporta conforme descrito na pergunta.

Eu tentei desinstalar este pacote e instalar inetutils , mas parece não haver nenhum comando ping .

Como posso resolver esse problema? (um invólucro, etc.)

EDIT1:

A resposta deve ser escrita em POSIX para portabilidade. Desculpe por esquecê-lo.

    
por Vlastimil 11.07.2018 / 10:00

1 resposta

0

abordagem POSIX

Caminho específico do Cygwin (wrapper)

# 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
}

Caminho específico do Windows (wrapper) [vencedor do concurso]

# 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
}

Forma específica do Linux (direta)

# 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
}

Notas

  • Estou ciente de que esta solução não é ideal, mas funciona

  • Estas funções podem ser simplesmente executadas ao descobrir qual programa como o comando ping estamos realmente usando, e embora isso esteja fora do escopo deste Q & A, deixo uma dica:

    command -v ping
    
  • Eu escolhi desinstalar o pacote ping do Cygwin e usar is_host_online_windows() porque ele é simplesmente mais rápido que o programa Cygwin.

  • Para completar, incluí is_host_online_linux() , embora não relacionado a essa pergunta.

por 12.07.2018 / 02:23