有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

要获取Java应用程序的状态代码,我可以执行以下操作:

RESULT=$(java <My app>)

要获取其输出流,我可以执行以下操作:

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

但我找不到一种方法同时得到这两个


共 (3) 个答案

  1. # 1 楼答案

    最近运行的程序的退出状态在变量$?中可用。因此,您可以这样做:

     $java <My app> >> Mylog.txt 2>&1
     RESULT=$?
    
  2. # 2 楼答案

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

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

    这里,-a要求tee附加到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

  3. # 3 楼答案

    标准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<&-