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

15

Tendo problemas com redis-cli. Quero verificar se a conexão 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

Eu esperaria Could not connect to Redis at 127.0.0.1:6379: Connection refusedser armazenado em $ test, mas esse texto será enviado para o console.

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

(Ubuntu 14.04.1)

DarkNeuron
fonte
Observe que if [[ -z $test ]]quase certamente se expandirá para if [[ -z ]]quando $testficar vazio, o que parece provável de quebrar o condicional. Para se proteger contra isso, basta colocar a variável entre aspas: if [[ -z "$test" ]] ; then.
um CVn
Na verdade, acho que as versões mais recentes do bash lidam com isso. Parece funcionar nos meus testes de qualquer maneira.
precisa saber é o seguinte
Bem, então, bom para você. :-) I tendem a gostar da rede de segurança adicional, se nada mais para preservar a minha sanidade mental quando se olha para o código mais tarde ...
um CVn

Respostas:

20

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

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

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

nesse caso, o [ -z "$test" ]teste 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 obter o que você deseja, dado o status de saída é trivial:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi
heemail
fonte
Ah, claro. É um erro! :)
DarkNeuron
Além disso, está solicitando problemas (ainda que um pouquinho) para usar o nome de um comando interno (e executável) - "test" para um nome de variável, portanto, apenas testar o status de saída, como na segunda solução, é melhor para essa razão também.
Joe