我使用 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
}