it-swarm.com.de

Ausgabe in Variable in Bash kann nicht erfasst werden

Probleme mit redis-cli. Ich möchte über BASH prüfen, ob die Verbindung zu redis abgelehnt wurde (Server nicht erreichbar).

Einfacher Test

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

Ich würde erwarten, dass Could not connect to Redis at 127.0.0.1:6379: Connection refused in $ test gespeichert wird, aber dieser Text wird stattdessen auf der Konsole ausgegeben.

Ich bin nicht sicher, was los ist. Hat jemand irgendwelche Ideen?

(Ubuntu 14.04.1)

15
DarkNeuron

Dies liegt daran, dass die Fehlermeldung an den STDERR-Stream (Dateideskriptor 2) gesendet wird, nicht an STDOUT (Dateideskriptor 1), den Sie mit der Befehlssubstitution $() erfassen.

Konzentriere dich nur darauf, den String zu bekommen, entweder auf STDOUT oder STDERR:

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

in diesem Fall führt der Test [ -z "$test" ] zu falsch positiven Ergebnissen, da die Fehlermeldung in der Variablen gespeichert wird. Stattdessen können Sie Folgendes tun:

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

Auch ich denke, dies sollte bekommen, was Sie wollen, da der Exit-Status trivial ist:

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