Java程序返回值无法传递给Shell脚本问题咨询
问题描述
集群目录home/下存放有app.jar和run_app.sh文件:
- Java应用打包在
app.jar中,通过以下代码设置返回值:
System.exit(1);
run_app.sh脚本内容:
typeset -i result result=$(java -jar tfs.jar -cp app/build/classes/java/main com.example.tfs.Application) echo ${result}
执行脚本可正常启动应用,但echo始终输出0。
尝试通过系统属性传递返回值:
- 修改Java代码:
System.setProperty("java.return.value", String.valueOf(1));
- 修改Shell脚本:
typeset -i result java -jar tfs.jar -cp tfs/build/classes/java/main com.example.tfs.TfsApplication export java.return.value=${result} echo ${result}
此时echo无输出,且报错:'export java.return.value=': not a valid identificator
需求:实现Java程序返回值传递给Shell脚本。
解决方案
错误原因分析
- 第一个脚本中
$(...)捕获的是Java程序的标准输出内容,而非进程退出状态码。System.exit(n)设置的是进程退出码,需通过$?获取,不能用命令替换。 - 第二个脚本的问题:
System.setProperty()仅设置JVM内部属性,Shell无法直接读取该属性。- Shell变量名不能包含
.,java.return.value是无效变量名,导致export报错。
正确实现方式
方式1:利用Java进程退出码(推荐)
保持Java代码的System.exit(1);,修改Shell脚本捕获退出码:
# 执行Java程序 java -jar app.jar -cp app/build/classes/java/main com.example.tfs.Application # $? 获取上一条命令的退出状态码 result=$? echo "Java程序返回值:${result}"
方式2:通过标准输出传递值
若需传递非退出码的自定义值,可让Java程序将值打印到标准输出,由Shell捕获:
- Java代码:
// 将值输出到标准输出 System.out.println(1); System.exit(0); // 退出码用于标识程序是否正常执行
- Shell脚本:
# 捕获Java程序的标准输出 result=$(java -jar app.jar -cp app/build/classes/java/main com.example.tfs.Application) echo "Java程序输出的值:${result}" # 同时获取退出码判断执行状态 exit_code=$? if [ ${exit_code} -eq 0 ]; then echo "程序执行成功" else echo "程序执行失败,退出码:${exit_code}" fi
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

