将命令输出重定向到 bash 中的变量失败

Posted

技术标签:

【中文标题】将命令输出重定向到 bash 中的变量失败【英文标题】:Redirecting command output to a variable in bash fails 【发布时间】:2012-05-06 09:05:07 【问题描述】:

我正在尝试将命令输出重定向到一个变量:

OUTPUT=$(sudo apache2ctl configtest)

然后阅读它:

echo $OUTPUT

运行时输出如下:

19:19:12 user@user ~ OUTPUT=$(sudo apache2ctl configtest)
Syntax OK
Syntax OK

但变量保持空白。我对其他命令进行了同样的尝试,一切正常。

OUTPUT=$(ls -l)

这会将文件列表写入变量OUTPUT,以便稍后读取。 我应该怎么做才能让它发挥作用?

【问题讨论】:

通常的原因是在 OUTPUT 和 = 之间有一个空格,您的情况不是这样吗? 【参考方案1】:

也许输出到stderr,而不是stdout?试试这个:

OUTPUT=$(sudo apache2ctl configtest 2>&1)

【讨论】:

我个人觉得***.com/a/3130425/1504300的答案更能解释【参考方案2】:

对于 nginx 可能的情况,当 configtest 可以成功但配置文件中有错误。 示例:

nginx: [warn] conflicting server name "test.com" on 0.0.0.0:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

要正确检查 bash 脚本中的错误,需要使用:

if [[ $((sudo /sbin/service nginx configtest) 2>&1 | grep "failed\|warn" ) ]]; then
    echo "ERROR!!!"
else
    echo "OK!!!"
fi

【讨论】:

if [[ $(<cmd>) ]]; then; echo error; else echo ok; fi 可以写成<cmd> || echo error; && echo ok; ,这样更简洁,命令更显眼。 (如果我的示例中的花括号(以及分号)只包含一个命令并且整个内容是单行的,那么它们也可以省略。)

以上是关于将命令输出重定向到 bash 中的变量失败的主要内容,如果未能解决你的问题,请参考以下文章

想要通过将输出重定向到变量来检查命令是不是成功

linux中的管道符重定向于环境变量

将所有输出重定向到 Bash 中的文件 [重复]

如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?

数据流重定向和管道命令(bash学习02)

将 cmd 中命令的输出重定向到 Python 3 中的变量