如果“make”命令失败,请检查输出并退出bash脚本

8

我不仅对bash很陌生,对于其他技术也不熟悉;不过,我写了一个bash脚本来执行我的cmake、make和c++可执行文件。

#! /bin/bash
cmake .
make
./pcl_visualizer_demo   <-- This is my executable

这个方法很好,但当我的代码无法编译时,它会执行旧的可执行文件并留下一堆问题。我希望将make的输出放入一个if语句中,只有在make成功时才运行可执行文件。我尝试了许多来自stackoverflow其他帖子的bash命令,但其中一些问题似乎是make的输出不是字符串,例如:

OUTPUT = make
echo $OUTPUT

提供:

[100%] Built target pcl_visualizer_demo

但是无法与以下内容一起使用:
if [`expr match "$OUTPUT" '[100%] -eq 5]; then ./pcl_visulizer_demo; fi

“更不用说我认为这一行可能有多个问题。我还尝试了以下操作:”
if [diff <(echo "$OUTPUT") <(echo '[100%] Built target pcl_visualizer_demo' -n]; then ./pcl_visulizer_demo; fi

可能是我没有正确实现。有什么帮助吗?


https://www.google.com/search?q=Check+the+output+of+make+and+exit+bash+script+if+it+fails - Karoly Horvath
4个回答

28

只需检查make的退出代码:

cmake . || exit 1
make || exit 1
./pcl_visualizer_demo 

1
非常感谢,它运行得很好!可惜我没有声望,无法为你投票 :(。 - CheesePita
1
太好了,感谢上帝,有人没有依赖于问题下的Google评论。 :) 你能解释一下这是如何工作的吗?当一切正常时,make将返回0,并且由于短路退出不会被执行?在失败的情况下,它会执行,但exit后面的1是什么?是脚本的返回值吗? - gsamaras
1
@gsamaras:是的,是的,是的。 :-) - choroba

11

你可以使用

set -e

在您的 shell 脚本开头

#!/bin/bash
set -e
cmake .
make
./pcl_visualizer_demo

来自“help set”

-e  Exit immediately if a command exits with a non-zero status.

默认情况下,这意味着:在任何错误发生时


5

你应该检查make命令的退出代码,例如:

if [ $? -eq 0 ]
then
  echo "Successfully made"
else
  echo "Could not compile" >&2
fi

并适当退出。按照惯例,退出代码为0表示成功。如果您有多个可执行文件,并且希望在任何一个返回非零退出代码时退出,您可以使用-e选项告诉bash做到这一点,例如:

  #!/usr/bin/bash -e

请确保可执行文件(makecmake)遵循此约定。更多关于退出码的信息,请参见此处


谢谢。不幸的是,make命令无论成功与否都会返回0。choroba建议使用or命令,它非常有效。我不能给你点赞,因为我没有声望:(。 - CheesePita
我会期望make在失败时不要返回0,而上面的||构造依赖于退出码不为0。因此,我建议您重新检查您的退出码(当然,Choroba的解决方案也可以)。 - Brian Agnew
是的,你说得对。你的方法也可以。我使用echo $?来测试make的输出,当它工作和失败时都会给我0。为什么我在终端上打印出这个,而你的代码在完整粘贴时却可以工作? - CheesePita

0
你可以尝试使用'$?'来确定你之前的bash命令的“退出状态”。通常,构建失败会以非零状态退出。通过echo '$?'来确认这在你的情况下是否正确。
然后使用普通的if语句来正确处理。

$?读取上一个执行的命令的退出状态。函数返回后,$?给出函数中执行的最后一个命令的退出状态。这是Bash为函数提供“返回值”的方式。 . . .
脚本终止后,从命令行获取的$?给出脚本的退出状态,即脚本中执行的最后一个命令的退出状态,按照惯例,成功时为0或错误时为1-255之间的整数。

来源: http://www.tldp.org/LDP/abs/html/exit-status.html


多么有用的命令。谢谢。不幸的是,make 命令返回 0,无论它是否失败。 choroba 建议使用 or 命令,效果很好。我不能给你点赞,因为我没有声望(reputation):(。 - CheesePita
正如Brian Agnew所指出的那样。make命令的输出并不总是0。但是当我执行echo $?时,总是得到0。我不确定为什么会这样。 - CheesePita

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