无法将输出捕获到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

Answers:


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

同样,使用内置命令(和可执行文件)的名称(如果只是一点点)也很麻烦(如果只是一点点的话)-使用“ test”作为变量名,因此像第二种解决方案中那样测试退出状态对于那个原因也是。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.