Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Omit error from shell script output

I'd like to omit the error from this IF statement if ICMP echo fails.

Example code:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

It works perfectly if the ping is successful or you run the command outside of a script, but gives the below output if there is no response.

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
PING NOK

I've seen answers for this out there quoting 2>/dev/null, but this then displays the entire ping query in the output, whether successful or not! Example with 2>/dev/null as below.

PING 1.2.3.4 (1.2.3.4): 56 data bytes

--- 1.2.3.4 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 26.134/26.134/26.134/0.000 ms
PING OK

This is a bit of a n00b question, but I'm a networking chap, not a developer :)

Thanks in advance!!

like image 420
Liam Mulligan Avatar asked Feb 12 '26 12:02

Liam Mulligan


1 Answers

The «classic» solution:

if ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

A somewhat more modern (and not POSIX-compliant!) approach, available since BASH 4:

if ping -q -c 1 -W 1 1.2.3.4 &>/dev/null; then
  echo -e "PING OK"
else
  echo -e "PING NOK"
fi

Both of these mean «redirect both STDOUT and STDERR to /dev/null», but the first one does it sequentially, first redirecting STDOUT and then redirecting STDERR to STDOUT.

like image 88
hidefromkgb Avatar answered Feb 14 '26 20:02

hidefromkgb



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!