如何检测shell中命令执行是否失败?

如何检测shell中命令执行是否失败?

我使用 Java 调用远程计算机中的 shell 脚本。

我想知道 shell 执行是否失败。但我发现,$?在脚本完成后检查返回码不起作用。$?仅指示脚本中最后一个命令的结果代码。

所以即使一个命令执行失败,但最后一个命令执行成功。我找不到它。我想知道如何解决问题?

我需要检查 shell 中每个命令的结果代码吗?如果某个命令执行失败,是否退出脚本?

答案1

您可以set -e在脚本内部使用,或-e在启动时传递给解释器。

#!/bin/sh
set -e

或者

/bin/sh -e /path/to/script.sh

 

http://pubs.opengroup.org/onlinepubs/007904975/utilities/set.html:

-e

启用此选项后,如果一个简单命令由于 Shell 错误的后果中列出的任何原因而失败,或者返回退出状态值 >0,并且不是 while、until 或 if 关键字后面的复合列表的一部分,并且不是 AND 或 OR 列表的一部分,也不是前面带有 ! 的管道。保留字,则 shell 应立即退出。

答案2

您也可以使用陷阱。

trap 'command' signal

你的 shell 脚本可能是这样的:

trap 'trapHandler $LINENO' ERR

捕获 ERR 信号。trapHandler()可以是这样的。

trapHandler()
{
    retCode=$?
    echo "[LINE:$1] Error:exited with status $retCode"
    exit $retCode
}

相关内容