Не могу записать вывод в переменную в Bash

15

Возникли проблемы с redis-cli. Я хочу проверить, redisотказано ли соединение с (сервер отключен), через BASH.

Простой тест

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

Я ожидаю, Could not connect to Redis at 127.0.0.1:6379: Connection refusedчто будет храниться в $ test, но этот текст вместо этого выводится на консоль.

Я не уверен, что происходит. У кого-нибудь есть идеи?

(Ubuntu 14.04.1)

DarkNeuron
источник
Обратите внимание, что if [[ -z $test ]]почти наверняка расширится до того, if [[ -z ]]когда $testстанет пустым, что, вероятно, нарушит условное. Для защиты от этого, просто поместите переменную в кавычки: if [[ -z "$test" ]] ; then.
CVn
Я действительно думаю, что более новые версии bash справляются с этим. В любом случае, похоже, работает в моих тестах.
DarkNeuron
Ну тогда хорошо для тебя. :-) Мне, как правило, нравится дополнительная сеть безопасности, если ничто иное не сохраняет мое здравомыслие, когда я смотрю на код позже ...
CVn

Ответы:

20

Это связано с тем, что сообщение об ошибке отправляется потоку STDERR (дескриптор файла 2), а не STDOUT (дескриптор файла 1), который вы захватываете с помощью подстановки команд $().

Просто сосредоточиться на получении строки, либо на STDOUT, либо на STDERR:

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

в этом случае [ -z "$test" ]проверка приведет к ложным срабатываниям, поскольку сообщение об ошибке будет сохранено в переменной. Вместо этого вы можете сделать:

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

Также я думаю, это должно получить то, что вы хотите, учитывая, что статус выхода тривиален:

if redis-cli exit &>/dev/null; then
    echo 'Succeeded!!'
else
    echo 'Failed!!'
fi
heemayl
источник
Ах, конечно. Это ошибка! :)
DarkNeuron
Кроме того, возникает проблема (хотя бы немного) использования имени встроенной команды (и исполняемого файла) - «test» для имени переменной, так что лучше просто проверить состояние выхода, как во втором решении. эта причина тоже.
Джо