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 usaris_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.