web-dev-qa-db-ja.com

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

redis-cliに問題があります。 BASHを介して、redisへの接続が拒否されている(サーバーがダウンしている)かどうかを確認します。

簡単なテスト

#!/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)

15
DarkNeuron

これは、コマンド置換$()でキャプチャしている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
20
heemayl