无法将输出捕获到 Bash 中的变量中

无法将输出捕获到 Bash 中的变量中

有问题redis-cli。我想通过 BASH 检查是否被拒绝连接redis(服务器关闭)。

简单测试

#!/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

相关内容