我有一个非常简单的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.redacted.redacted.App.main(App.java:27)
我的bash脚本仍将返回“ run:yes”。我假设这是因为就bash而言,它称为脚本并已运行。我有办法确定Java程序是否成功运行吗?
是,可以。但是您必须从Java程序内部使用System.exit(0)
完成执行并与bash交流,一切都OK。只需返回1
而不是0
即可传达错误。响应将存储在bash环境中的$?
中,以在if
中使用。
关于如何在bash上使用$?
结果还有另一个答案:
通常退出'main'方法(没有显式退出)将向外壳返回'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,并检查错误消息(凌乱)。否则,您很不走运