Não é possível capturar saída em variável no Bash

14

Problemas com redis-cli . Eu quero verificar se a conexão com redis é recusada (servidor inativo), através do BASH.

Teste simples

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

Espero que Could not connect to Redis at 127.0.0.1:6379: Connection refused seja armazenado em $ test, mas este texto é enviado para o console.

Eu não tenho certeza do que está acontecendo. Alguém tem alguma ideia?

(Ubuntu 14.04.1)

    
por DarkNeuron 16.08.2016 / 15:37

1 resposta

18

Isso porque a mensagem de erro está sendo enviada para o fluxo STDERR (descritor de arquivo 2), não para STDOUT (descritor de arquivo 1) que você está capturando com a substituição de comando $() .

Concentre-se apenas em obter a string, seja em STDOUT ou STDERR:

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

Nesse caso, o teste [ -z "$test" ] resultará em falsos positivos, pois a mensagem de erro será armazenada na variável. Em vez disso você pode fazer:

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

Também acho que isso deve ser o que você quer, já que o status de saída é trivial:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi
    
por heemayl 16.08.2016 / 15:47