Bashの変数に出力をキャプチャできません


15

に問題があるredis-cliredisBASHを使用して、接続が拒否されている(サーバーがダウンしている)かどうかを確認します。

簡単なテスト

#!/bin/bash
test=$(redis-cli exit) #exit out of the "not connected console"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

Could not connect to Redis at 127.0.0.1:6379: Connection refused$ testに保存されることを期待しますが、このテキストは代わりにコンソールに出力されます。

何が起こっているのか分かりません。誰にもアイデアはありますか?

(Ubuntu 14.04.1)


空になるif [[ -z $test ]]とほぼ確実に拡張さif [[ -z ]]れることに注意してください$test。これは条件を破る可能性が高いようです。これを防ぐには、変数を引用符で囲んでください:if [[ -z "$test" ]] ; then
CVn

実際、新しいバージョンのbashがそれを処理していると思います。とにかく私のテストで動作するようです。
DarkNeuron

それでは、あなたに良い。後でコードを見たときに何も私の正気を維持する場合:-)私は、追加の安全ネットを好む傾向にある...
からCVn

回答:


20

これは、コマンド置換でキャプチャしているSTDOUT(ファイル記述子1)ではなく、STDERRストリーム(ファイル記述子2)にエラーメッセージが送信されているため$()です。

STDOUTまたはSTDERRで文字列を取得することに焦点を合わせます。

test="$(redis-cli exit 2>&1)"

その場合、[ -z "$test" ]エラーメッセージが変数に保存されるため、テストの結果は偽陽性になります。代わりに次のことができます:

#!/bin/bash
test="$(redis-cli exit 2>/dev/null)"
if [[ -z $test ]] ; then
    echo "I'm empty :("
fi

また、終了ステータスが簡単な場合、これはあなたが望むものを取得するはずだと思います:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi

ああ、もちろん。エラーです!:)
DarkNeuron

また、組み込みコマンド(および実行可能ファイル)の名前を使用するために(少しだけ)トラブルを要求しているため、変数名に「テスト」を使用するため、2番目のソリューションのように終了ステータスをテストすることをお勧めしますその理由も。
ジョー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.