从bash调用java程序时检测java程序是否失败

从bash调用java程序时检测java程序是否失败,java,bash,Java,Bash,我有一个非常简单的bash脚本,它调用一个java程序。如果java程序运行成功或失败,我需要这个bash脚本将输出写入stdout #!/bin/bash if java -jar java_program.jar arg1 ; then echo "run:yes" else echo "run:no" fi 如果我的java程序返回 java.lang.ArrayIndexOutOfBoundsException 位于java.lang.System.arraycopy(本机方法

我有一个非常简单的bash脚本,它调用一个java程序。如果java程序运行成功或失败,我需要这个bash脚本将输出写入stdout

#!/bin/bash
if java -jar java_program.jar arg1 ; then echo "run:yes"
    else echo "run:no"
fi
如果我的java程序返回

java.lang.ArrayIndexOutOfBoundsException 位于java.lang.System.arraycopy(本机方法) 在com.redacted.redacted.AdvancedEncryptionStandard.decrypt(AdvancedEncryptionStandard.java:48) 在com.redacted.redacted.App.getStuff(App.java:58) 位于com.redact.redact.App.main(App.java:27)


我的bash脚本仍将返回“run:yes”。我假设这是因为就bash而言,它调用了脚本并运行了。我有没有办法判断java程序是否真的成功运行

是的,你可以。但是您必须在java程序内部使用
System.exit(0)
,以完成执行并与bash通信,确保一切正常。只需返回
1
即可传达错误。响应将存储在bash环境中的
$?
中,用于
if

关于如何在bash上使用
$?
结果,还有另一个答案:


是的,你可以。但是您必须在java程序内部使用
System.exit(0)
,以完成执行并与bash通信,确保一切正常。只需返回
1
即可传达错误。响应将存储在bash环境中的
$?
中,用于
if

关于如何在bash上使用
$?
结果,还有另一个答案:


通常退出“main”方法(不显式退出)将向shell返回“0”。未捕获的异常将返回状态1

javac a
java a
xception in thread "main" java.lang.Exception
    at a.main(a.java:4)

echo $?
=> 1
a在哪里

class a {
    public static void main(String [] args) throws Exception {
        System.out.println("Hello\n") ;
        throw new Exception() ;
    }
}
表面上看,这是一种情况,
main
只捕获异常,打印它,然后忽略异常,因此调用进程返回0

class a {
    public static void main(String [] args) {
        System.out.println("Hello\n") ;
        try {
          doSomething() ;
        } catch (Exception e) {
           e.printStackTrace) ;
        } ;
    }
}

几种可能的方法:(1)重写main以允许异常“冒泡”,以及(2)编写将执行旧main的新main,并检查是否成功(3)捕获stderr,并检查错误消息(凌乱)。否则,您就倒霉了

通常退出“main”方法(不显式退出)会将“0”返回shell。未捕获的异常将返回状态1

javac a
java a
xception in thread "main" java.lang.Exception
    at a.main(a.java:4)

echo $?
=> 1
a在哪里

class a {
    public static void main(String [] args) throws Exception {
        System.out.println("Hello\n") ;
        throw new Exception() ;
    }
}
表面上看,这是一种情况,
main
只捕获异常,打印它,然后忽略异常,因此调用进程返回0

class a {
    public static void main(String [] args) {
        System.out.println("Hello\n") ;
        try {
          doSomething() ;
        } catch (Exception e) {
           e.printStackTrace) ;
        } ;
    }
}
几种可能的方法:(1)重写main以允许异常“冒泡”,以及(2)编写将执行旧main的新main,并检查是否成功(3)捕获stderr,并检查错误消息(凌乱)。否则,你就不走运了