Неможливо захопити вихід у змінну в 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)


Зауважте, що 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

Ах, звичайно. Це помилка! :)
DarkNeuron

Крім того, він вимагає неприємностей (хоча б трохи) використовувати ім'я вбудованої команди (і виконуваного файлу) - "тест" на ім'я змінної, тому просто тестування стану виходу, як у другому рішенні, краще для це теж причина.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.