如果外壳脚本中的命令失败,则不确定如何发送错误代码

时间:2019-06-04 15:23:18

标签: shell exit-code

我最近了解了一个if语句,该语句查看先前的命令,如果失败,则将发送退出代码1和一条消息。我记不清整个声明了,但是它从下面开始:

if [ $? != "0" ]

该语句如何结束?它遵循脚本中的每个命令吗?

1 个答案:

答案 0 :(得分:1)

不要那样做。几乎不需要显式引用$?。如果要在命令失败时以状态1退出,则只需执行以下操作:

cmd || exit 1

如果要使用命令返回的相同非零值退出,则只需执行以下操作:

cmd || exit

那里有很多错误代码的示例,它们代替了执行以下操作:

cmd
if [ "$?" -ne 0 ]; then echo cmd failed >&2; exit 1; fi

这是一个不好的做法,原因有很多。让shell打印关于失败的通用消息毫无意义;该命令本身应该已经写了一条详细的错误消息,模糊的“ cmd失败”只是线路噪音。另外,您经常会看到set -e,它基本上在每个简单命令的末尾都打了一个|| exit,但有很多意想不到的副作用和边缘情况,并且其实现在整个历史和不同版本中都发生了变化相同外壳的处理不同情况下的边缘情况,因此使用它并不是一个好主意。

关于“该陈述如何结束?”的问题;它以fi结尾。 if的一般形式是if CMD; then ...; else ...; fi,其中CMD是一些管道集(例如,您可以执行if echo foo | grep bar; cmd2 | foo; then ....)。如果CMD返回0状态,则执行第一组命令(在“ then”和“ else”之间)。如果CMD返回非零值,则执行“ else”和“ fi”之间的命令。 “ else”子句是可选的。不要被[所欺骗;这只是一个命令。我认为,如果您使用其备用拼写test,则不需要使用]的最终参数,这样会更清楚。 IOW,您可以编写if test "$?" -ne 0; then ...; fi