Shell脚本判断Java程序成功退出后创建文件失效问题求助
问题原因
你写的脚本不生效的核心原因是shell变量的提前展开:
trap后触发的命令你用了双引号包裹,shell会在定义trap规则的阶段就解析并展开双引号内的所有变量,此时$?取的是trap命令本身的执行状态(trap定义成功状态码就是0),相当于你实际注册的EXIT触发逻辑是固定的if [ 0 -eq 0 ]; then touch /tmp/javaCompleted; fi,自然不管java程序返回什么退出码,都会创建文件。
修复方案
有三种常用的可行方案,你可以根据自己的脚本场景选择:
方案1:修改trap的引号类型
把双引号换成单引号,单引号内的变量不会在定义阶段展开,会等到EXIT信号触发、实际执行trap逻辑时才解析$?,此时$?就是脚本最后一条执行命令的状态码:
trap 'if [ $? -eq 0 ]; then touch /tmp/javaCompleted; fi' EXIT java app.jar
注意:该方案仅适用于
java app.jar是脚本最后一条执行命令的场景,如果java命令后还有其他逻辑,$?会被后续命令的状态码覆盖。
方案2:直接在java命令后判断(最直观)
如果不需要用trap捕获全局退出,直接在java命令执行完成后判断状态码即可,逻辑更清晰不易出错:
java app.jar if [ $? -eq 0 ]; then touch /tmp/javaCompleted fi
方案3:存储java退出码(适配java后还有其他逻辑的场景)
如果你的脚本在java命令执行完成后还要跑其他逻辑,又要严格以java的退出码为判断依据,可以把java的退出码提前存入变量,trap逻辑直接判断该变量:
# 初始化java退出码为非0值 JAVA_EXIT_CODE=1 # trap逻辑判断存储的java退出码 trap 'if [ $JAVA_EXIT_CODE -eq 0 ]; then touch /tmp/javaCompleted; fi' EXIT # 执行java程序 java app.jar # 立刻保存java的退出码,避免被后续命令覆盖 JAVA_EXIT_CODE=$? # 这里可以加其他后续脚本逻辑,不会影响已存储的退出码
内容的提问来源于stack exchange,提问作者Mit94
相关产品推荐
相关产品推荐

