无法从$获得正确的退出代码?

时间:2019-07-14 15:06:46

标签: bash shell

我正在编写一个备份bash脚本,并将其组织为一组从主.sh文件(如任何常规PL中的库)调用的几个.sh文件(每个文件执行一个功能)。其中之一是日志记录脚本,它将获取先前执行的命令的退出代码,如果脚本成功,则脚本记录一条消息,否则记录一条消息。

但是,如果我检查$?在日志记录脚本中,无论主脚本中先前命令的结果如何,我总是得到0代码。据我了解的过程,从外部文件调用脚本会使脚本在具有$?的其他子shell中执行。值为0,因为在该子shell中没有任何失败。

send
#main.sh:

command; log.sh "message" "error"

$?始终为0,因此始终记录成功消息。如何获取上面“命令”的实际退出代码?

我可能将其存储在某个文件中,并在log.sh的开头读取该文件,但我觉得有更好的解决方案。

2 个答案:

答案 0 :(得分:2)

替换

command; log.sh "message" "error"

使用

command; log.sh "message" "error" "$?"

if [ "${?}" -eq "0" ]; then

使用

if [ "$3" -eq "0" ]; then

答案 1 :(得分:2)

如您所述,由于log.sh是脚本,因此它在单独的shell中执行,因此调用者的$?对它不可见。脚本启动时,$?最初为0。

您可以将日志记录功能包装到一个函数中,以使$?可见:

log() {
    if [ "${?}" -eq "0" ]; then
      printf "${1}\n" >> main.log
    else
      printf "${2}\n" >> main.log
    fi
}

但是最好按照@cyrus的建议显式地传递$?


您可能想看看此处实现的日志记录和错误处理功能:

https://github.com/codeforester/base/blob/master/lib/stdlib.sh