No se puede capturar la salida en variable en Bash

15

¿Tiene problemas con redis-cli. Quiero verificar si redisse rechaza la conexión a (servidor apagado), a través de BASH.

Prueba simple

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

Esperaría Could not connect to Redis at 127.0.0.1:6379: Connection refusedestar almacenado en $ test, pero este texto se envía a la consola.

No estoy seguro de lo que está pasando. ¿Alguien tiene alguna idea?

(Ubuntu 14.04.1)

Neurona Oscura
fuente
Tenga en cuenta que if [[ -z $test ]]casi con seguridad se expandirá if [[ -z ]]cuando $testesté vacío, lo que probablemente romperá el condicional. Para protegerse contra esto, simplemente poner la variable entre comillas: if [[ -z "$test" ]] ; then.
un CVn
De hecho, creo que las versiones más nuevas de bash manejan eso. Parece funcionar en mis pruebas de todos modos.
DarkNeuron
Pues bien, bien por ti. :-) Me gusta la red de seguridad adicional, si nada más para preservar mi cordura cuando miro el código más tarde ...
un CVn

Respuestas:

20

Esto se debe a que el mensaje de error se envía a la secuencia STDERR (descriptor de archivo 2), no a STDOUT (descriptor de archivo 1) que está capturando con la sustitución de comandos $().

Solo se enfoca en obtener la cadena, ya sea en STDOUT o STDERR:

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

en ese caso, la [ -z "$test" ]prueba dará como resultado falsos positivos ya que el mensaje de error se almacenará en la variable. En cambio, puedes hacer:

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

También creo que esto debería obtener lo que deseas dado que el estado de salida es trivial:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi
heemayl
fuente
Ah, por supuesto. Es un error! :)
DarkNeuron
Además, está pidiendo problemas (aunque solo sea un poco) para usar el nombre de un comando incorporado (y ejecutable): "probar" para un nombre de variable, por lo que probar el estado de salida como en la segunda solución es mejor para Esa razón también.
Joe