web-dev-qa-db-fra.com

Impossible de capturer la sortie en variable dans Bash

Avoir des problèmes avec redis-cli. Je veux vérifier si la connexion à redis est refusée (serveur arrêté), via BASH.

Test simple

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

Je m'attendrais à ce que Could not connect to Redis at 127.0.0.1:6379: Connection refused soit stocké dans $ test, mais ce texte est plutôt affiché sur la console.

Je ne sais pas ce qui se passe. Quelqu'un a des idées?

(Ubuntu 14.04.1)

15
DarkNeuron

En effet, le message d'erreur est envoyé au flux STDERR (descripteur de fichier 2) et non à STDOUT (descripteur de fichier 1) que vous capturez avec la substitution de commande $().

Concentrez-vous simplement sur la chaîne, soit sur STDOUT, soit sur STDERR:

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

dans ce cas, le test [ -z "$test" ] donnera des faux positifs car le message d'erreur sera stocké dans la variable. Au lieu de cela, vous pouvez faire:

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

Aussi, je pense que cela devrait obtenir ce que vous voulez étant donné le statut de sortie est trivial:

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