You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:15:03