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

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脚本。

解决方案

错误原因分析

  1. 第一个脚本中$(...)捕获的是Java程序的标准输出内容,而非进程退出状态码。System.exit(n)设置的是进程退出码,需通过$?获取,不能用命令替换。
  2. 第二个脚本的问题:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:15:17