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

Возникли проблемы с 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)

1 ответ

Решение

Это связано с тем, что сообщение об ошибке отправляется потоку 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
Другие вопросы по тегам