Bash:检查命令输出

11

我需要在bash脚本中检查apachectl configtest的输出,如果一切正常而不向屏幕输出命令,则重新启动。

var =sudo apachectl configtest

如果 var 包含 "Syntax OK" 则

sudo apachectl graceful

如何做?


我不确定你所说的“输出到屏幕”是什么意思,但是如果你手动运行脚本,可以在终端中看到它运行的命令的输出。你也可以使用 > 将命令输出保存到文件中,如下所示:[command] > [filepath] - ifconfig
4
根据文档apachectl graceful在重新启动之前会自动运行configtest。 - Steve Trout
如果configtest发现问题,它会失败吗? - dev810vm
没错。如果“configtest”失败,它不会停止或启动守护进程。 - that other guy
3
你的问题可能更适合于StackExchange网站中的Super UserServer FaultUnix & Linux - David C. Rankin
显示剩余2条评论
3个回答

10

我知道这是旧帖子,问题不适合在该特定网站上提问。无论如何,当我搜索相同的问题时,这个页面显示为第一个搜索结果。因此,我在这里发布我的最终解决方案,供参考。

configtestResult=$(sudo apachectl configtest 2>&1)

if [ "$configtestResult" != "Syntax OK" ]; then
    echo "apachectl configtest returned the error: $configtestResult";
    exit 1;
else
    sudo apachectl graceful
fi

这个主题包含一个提示,有关捕获configtest输出的。


3

就像@slm在这个链接中所说的那样,您可以使用-q来保持安静。这样它就不会在屏幕上输出命令。确保变量、'='和命令之间没有空格,就像@William Pursell在这里所说的那样。之后测试一下你的变量是否包含"Syntax OK"。以下代码片段实现了这一点。

var1=$(sudo apachectl configtest)

if echo $var1 | grep -q "Syntax OK"; then
    sudo apachectl graceful
fi

apachectl configtest 写入 stderr。var1 没有捕获任何内容。 - Dale C. Anderson

2

你需要的第一条命令中使用的 bash 语法可能是 "命令替换":

VAR=$(sudo apachectl configtest)

VAR 将包含命令行的输出。

但是,如果你只想知道输出是否包含 "Syntax OK",可以这样做:

sudo apachectl configtest | grep -q "Syntax OK" && proceed || handle-error

其中 proceedhandle-error 是分别处理正常和错误情况的函数。

(注意 grep 的 -q 选项以隐藏 apachectl 命令的输出。)


这个代码原理上是可行的,但存在一些问题。如果没有将 apachectl configtest 2>&1 的输出重定向,proceed 就永远不会被执行。此外,如果 proceed 执行出现错误,handle-error 也会被执行,而这可能并非你想要的。 - Dale C. Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接