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

时间:2014-03-18 11:13:03

标签: bash

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

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

(java HelloWorld "$@" 2>&1 ) | tee /tmp/log.txt

我跑了:

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

$ echo $?
0

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

我需要java_debug返回与java执行

相同的退出代码

如何修复此脚本?

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

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

1 个答案:

答案 0 :(得分:4)

在这里找到答案:Get exit code from subshell through the pipes

就我而言:

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

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