【问题标题】:Return Java system exit value to bash script将 Java 系统退出值返回给 bash 脚本
【发布时间】:2013-09-16 19:33:58
【问题描述】:

我正在尝试将 java 程序 (System.exit(1);) 的返回值获取到 shell 脚本中,但它似乎返回了 jvm 退出代码,如果它没有崩溃,它总是 0。出于测试目的,这是我的 main() 中的第一行。 有人知道怎么做吗?

我的 bash 代码:

java  bsc/cdisc/ImportData $p $e $t


#-----------------------------------------
# CATCH THE VALUE OF ${?} IN VARIABLE 'STATUS'
# STATUS="${?}"
# ---------------------------------------
STATUS="${?}"

# return to parent directory
cd ../scripts


echo "${STATUS}"

谢谢

【问题讨论】:

  • 有趣,因为这应该可以工作。还有更多细节吗?另外,为什么是花括号?

标签: java shell


【解决方案1】:

如果您的脚本只有两行,那么您没有检查正确的退出代码。

我猜你正在做类似的事情:

$ java YourJavaBinary
$ ./script 

其中脚本仅包含:

STATUS="${?}"
echo "${STATUS}"

这里,script 在子shell 中执行。因此,当您执行脚本时,$? 是该 shell 中最后一个命令的值,在子 shell 中没有任何内容。因此,它总是返回0

您可能想要做的是在脚本本身中调用 java 二进制文件。

java YourJavaBinary
STATUS="${?}"
echo "${STATUS}"

或者不使用脚本直接检查退出代码:

$ java YourJavaBinary ; echo $?

【讨论】:

  • 抱歉,我在我的代码中调用了 java 二进制文件,这并不是脚本中的全部内容。我只是提出了错误报告部分。
  • 所以你在脚本中有java YourJavaBinary ; STATUS="${?}" ; echo "${STATUS}",但它仍然没有在你的脚本中给出正确的退出代码?如果真是这样,那就奇怪了。可能是,您能否展示与调用 java 和退出代码检查相关的整个部分,您能否使用仅执行 System.exit(1); 的简单 java 程序产生相同的问题?
  • 重申一下,java ...STATUS="${?}" 之间没有 任何 语句(不包括 cmets)对吗? :) 你能重现我在之前评论中描述的问题吗?
【解决方案2】:

你应该这样做:

Test.java:

public class Test{
        public static void main (String[] args){
                System.exit(2);
        }
}

test.sh

#!/bin/bash

java Test
STATUS=$?
echo $STATUS

【讨论】:

  • 是的!你说得对。我口袋里有解决方案并使用了它,但我不知道为什么理解错误。我应该投票删除我的答案吗?
  • Danilo,这正是我所拥有的。(并且拥有)。我没有发布整个脚本,因为大多数都是无关紧要的。
猜你喜欢
  • 2018-04-20
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2016-08-31
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多