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)


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.