如何在shell脚本中获取Java应用程序的退出状态,标准输出和标准错误流?

时间:2013-11-26 11:33:51

标签: java shell

我的shell脚本需要获取结果(退出状态)并从Java应用程序捕获日志输出,该应用程序写入其标准输出和标准错误行。

要获取Java应用程序的状态代码,我可以这样做:

RESULT=$(java <My app>)

要获得其输出流,我可以这样做:

$java <My app> >> Mylog.txt 2>&1 || true;

但我找不到两种方法。

3 个答案:

答案 0 :(得分:1)

变量$?中提供了最近运行的程序的退出状态。因此,你可以这样做:

 $java <My app> >> Mylog.txt 2>&1
 RESULT=$?

答案 1 :(得分:0)

标准unix方式的最佳解决方案是重定向stderr和/或stdout文件描述符:

在你的调用之前重定向stderr,捕获结果并尽快恢复:

示例:

#!/bin/bash
...
#Modify sdterr file descriptor

exec 6<&2
exec 2>$LOG_STDERR

#Your Java Invokation 
$("here invoke your java")
$RESULT = $?

#Restore sdterr file descriptor
exec 2<&6 6<&-

答案 2 :(得分:-1)

您可以使用tee命令附加输出并继续写入stdout:

RESULT_STDOUT=$($java classname | tee -a Mylog.txt)

在这里,如果可能,-a要求T恤附加到Mylog.txt。

我不确定你为什么需要true,所以我将其排除在外。这里的主要问题是如何保留错误日志。如果你2>&1,它将成为Mylog.txt的一部分,但也会成为结果的一部分。如果将错误日志存储在单独的文件中就足够了,可以使用

重定向它
RESULT_STDOUT=$($java classname 2>> Mylog.error.txt | tee -a Mylog.txt)

修改: 您可以通过$PIPESTATUS获得退出状态,正如@Raedwald指出的那样:Pipe output and capture exit status in Bash。上述解决方案仅将stdout捕获为RESULT_STDOUT