Bash'te çıktılar değişkene kaydedilemiyor


15

Sorun yaşıyorum redis-cli. redisBASH ile bağlantının reddedildiğini (sunucu kapalı) kontrol etmek istiyorum .

Basit test

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

Ben Could not connect to Redis at 127.0.0.1:6379: Connection refused$ test saklanır beklenir , ancak bu metin bunun yerine konsola çıktı.

Neler olup bittiğinden emin değilim. Herhangi bir fikri olan var mı?

(Ubuntu 14.04.1)


Not if [[ -z $test ]]neredeyse kesin genişleyecek if [[ -z ]]zaman $testkoşullu kırmaya muhtemel görünüyor ki, boş olur. Buna karşı korunmak için değişkeni tırnak içine almanız yeterlidir if [[ -z "$test" ]] ; then.
CVn

Aslında bash'ın daha yeni sürümlerinin bunu hallettiğini düşünüyorum. Zaten testlerimde çalışıyor gibi görünüyor.
DarkNeuron

O zaman, senin için iyi. :-) Daha sonra koda bakarken akıl sağlığımı korumak için başka bir şey yoksa, ek güvenlik ağını sevme eğilimindeyim ...
CVn

Yanıtlar:


20

Bunun nedeni, hata mesajının, komut değiştirme ile yakaladığınız STDOUT'a (dosya tanıtıcı 1) değil, STDERR akışına (dosya tanıtıcı 2) gönderilmesidir $().

STDOUT veya STDERR'da dizeyi almaya odaklanmanız yeterlidir:

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

bu durumda, [ -z "$test" ]hata mesajı değişkende saklanacağı için test yanlış pozitiflerle sonuçlanır. Bunun yerine şunları yapabilirsiniz:

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

Ayrıca, bu çıkış durumu önemsiz göz önüne alındığında ne istediğinizi almalısınız düşünüyorum:

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

Ah, elbette. Bu bir hata! :)
DarkNeuron

Ayrıca, yerleşik bir komutun (ve yürütülebilir) adını kullanmak için sorun (sadece biraz da olsa) - bir değişken adı için "test edin", bu nedenle sadece ikinci çözümdeki gibi çıkış durumunu test etmek daha iyidir. bu nedenle.
Joe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.