2017-07-03 16 views
2

ICMPエコーが失敗した場合、このIF文からエラーを省略したいと思います。シェルスクリプトの出力からエラーを省略します。

例コード:

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

それはpingが成功するか、スクリプトの外部でコマンドを実行した場合、完全に動作しますが、応答がない場合は、以下の出力が得られます。

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 

私はこのそこに引用2>は/ dev/nullのための答えを見てきましたが、これはその後、成功したかどうかにかかわらず、出力全体ping照会を表示します!以下のように、2>/dev/nullの例。

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 

これはN00B質問のビットですが、私はネットワーキングのやつではなく、開発者:)事前に

のおかげですよ!

答えて

2

«古典»ソリューション:(!とない POSIX準拠)

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 

もう少し現代的な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 

これらの両方を表示«意味STDOUTとSTDERRの両方を/ dev/null»にリダイレクトしますが、最初はSTDOUTをリダイレクトしてからSTDERRをSTDOUTにリダイレクトします。

+2

パーフェクトを終了状態を使用することができます!本当にありがとう。 @LiamMulligan私の喜び。 –

+0

質問を解決済みとマークするのを忘れないでください。 – hidefromkgb

+0

'&>'を使うのは "もっと近代的"ではありません。これは、シェル標準に違反するひどいハックです(または、せいぜい標準のあいまいさを悪用します)。 posix準拠のシェルは、 'cmd&>/dev/null'をcmdを非同期に実行し、/ dev/nullへの些細なリダイレクトを実行する' cmd>/dev/null'と同じように解釈します。それは避けられない構造物です。 –

0

あなたは...あまりにも[ Check this ]

ping -q -c 1 -W 1 1.2.3.4 >/dev/null 2>&1 
[ $? -eq 0 ] && echo "Ping OK" || echo "Ping NOK" 
関連する問題