我有以下 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 是一种可怕的语言,不应该使用它;但在这种情况下我别无选择。
在这里找到答案:通过管道从子外壳获取退出代码
就我而言:
#! /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)