bash 从子 shell 和管道获取退出代码

Dav*_*lla 1 bash

我有以下 bash 脚本java_debug来记录所有 java 执行(标准和错误控制台):

#! /bin/bash
echo param1: $1
echo param2: $2

(java HelloWorld "$@" 2>&1 ) | tee /tmp/log.txt
Run Code Online (Sandbox Code Playgroud)

我运行它:

$ java_debug v1 "v2 with space"
param1: v1
param2: v2 wirh space
Error: Could not find or load main class HelloWorld

$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

在此示例中,java 找不到 HelloWorld 类,因此显示错误。但是,错误在 $? 中丢失了?(我们得到 0 而不是 1)因为子 shell 和/或管道。

我需要 java_debug 返回与 java 执行相同的退出代码

如何修复这个脚本?

注意:我可以使用script命令代替2>&1 | tee,但不幸的是脚本命令的实现在不同的系统中发生了变化(Redhat 中的脚本参数与 OSX 中的脚本参数不同)。

注意:我知道 bash 是一种可怕的语言,不应该使用它;但在这种情况下我别无选择。

Dav*_*lla 5

在这里找到答案:通过管道从子外壳获取退出代码

就我而言:

#! /bin/bash
echo param1: $1
echo param2: $2

(java HelloWorld "$@" 2>&1 ) | tee /tmp/log.txt
exit ${PIPESTATUS[0]}
Run Code Online (Sandbox Code Playgroud)