2016-05-12 2 views
0

私は私のネットワークは私のルータを再起動した後、背面に来るときを検出するには、次のスクリプトを持っている:ターミナルで実行した場合コマンドが変数として渡されたときにstdout/stderrリダイレクションをコマンドのサブプログラムに含めるにはどうすればよいですか?

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

while [[ ! $($pingCommand) ]]; do 
    sleep 3s; 
done 

は、しかし、それは印刷します

のping:不明なホスト&を>/dev/null

私は(デバッグを有効にする)-xオプションを使用してスクリプトを実行し、その

を見つけました10
ping 192.168.1.1 -c 3 &>/dev/null 

はbashが出力リダイレクトの周りに単一引用符を入れないように、どのように私はコマンド置換の呼び出しを変更できますか?

ping 192.168.1.1 -c 3 '&>/dev/null' 

としてサブシェルで実行していましたか

+2

http://mywiki.wooledge.org/BashFAQ/050 – 123

答えて

7

Don't store commands in variables. Use functions.これらはリダイレクトとパイプを扱い、変数を悩ませている引用の問題はありません。

また、すべての出力を/dev/nullにリダイレクトするときに、pingの出力をキャプチャしようとすると意味がありません。それが効果があるかどうかだけを知りたい場合は、終了コードを確認してください。

pingCommand() { 
    ping 192.168.1.1 -c 3 &>/dev/null 
} 

while ! pingCommand; do 
    sleep 3s; 
done 
+0

私は終了コードをチェックしていますが、問題がある場合は、エラーが端末に表示されますが、それは望ましくありません。 – crimsonspectre

+0

stdoutとstderrの両方を隠している '>/dev/null'があるので、それらはしません。 –

+0

元々、私は '>/dev/null'を持っていなかったので、エラーを表示していました。上記のスクリプトに '>/dev/null'を追加したとき、それは壊れたときだったので、質問はhaha – crimsonspectre

0

使用eval

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

# set -x # uncomment to see what's going on 

while ! eval $pingCommand ; do 
    sleep 3s; 
done 

そして、あなたは[[ ]](式の評価)または$()(出力キャプチャ)を必要としません。

もちろん、John Kugelmanが別の答えで示唆したように、関数を使用すると、evalに関連するすべての潜在的な落とし穴が回避されます。

+1

かsh -c $ pingCommand – fche

+1

@fche、' bash -c ... 'という意味になります。 POSIXシェルはリダイレクトを '&>できません。 – Dummy00001

関連する問題