我的shell脚本需要获取结果(退出状态)并从Java应用程序捕获日志输出,该应用程序写入其标准输出和标准错误行。
要获取Java应用程序的状态代码,我可以这样做:
RESULT=$(java <My app>)
要获得其输出流,我可以这样做:
$java <My app> >> Mylog.txt 2>&1 || true;
但我找不到两种方法。
答案 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
。