我正在编写一个备份bash脚本,并将其组织为一组从主.sh文件(如任何常规PL中的库)调用的几个.sh文件(每个文件执行一个功能)。其中之一是日志记录脚本,它将获取先前执行的命令的退出代码,如果脚本成功,则脚本记录一条消息,否则记录一条消息。
但是,如果我检查$?在日志记录脚本中,无论主脚本中先前命令的结果如何,我总是得到0代码。据我了解的过程,从外部文件调用脚本会使脚本在具有$?的其他子shell中执行。值为0,因为在该子shell中没有任何失败。
send
#main.sh:
command; log.sh "message" "error"
$?始终为0,因此始终记录成功消息。如何获取上面“命令”的实际退出代码?
我可能将其存储在某个文件中,并在log.sh的开头读取该文件,但我觉得有更好的解决方案。
答案 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