bash eval未检测到System.exit返回码

iha*_*nny 5 java error-handling bash

挣扎了一个小时...... java代码:

ULogger.info("throwing out 666!");
System.exit(666);
Run Code Online (Sandbox Code Playgroud)

bash包装:

eval ${COMMAND_TO_RUN}
ret_code=$?
printf "error code : [%d]" ${ret_code}
Run Code Online (Sandbox Code Playgroud)

输出:

[2012-11-30 15:20:12,971][INFO ] throwing out 666!
error code : [0]
Run Code Online (Sandbox Code Playgroud)

这是什么交易?谢谢...

[编辑]

${COMMAND_TO_RUN}IS

((java -Xmx9000m -Dtoday_nix=20121128 -cp "/usr/lib/hadoop/conf" com.paypal.risk.ars.linking.task_fw.BaseRunnableProcess 3>&1 1>&2 2>&3) | tee /dev/tty) > batches_errors.log
Run Code Online (Sandbox Code Playgroud)

nem*_*emo 6

你的问题在于COMMAND_TO_RUN:

((java -Xmx9000m -Dtoday_nix=20121128 -cp "/usr/lib/hadoop/conf" com.paypal.risk.ars.linking.task_fw.BaseRunnableProcess 3>&1 1>&2 2>&3) | tee /dev/tty) > batches_errors.log
Run Code Online (Sandbox Code Playgroud)

调用的最后一个程序是tee,它将以状态退出0,覆盖退出值java.

您可以使用$PIPESTATUS,这是管道中的返回值数组.

例如:

$ cat nonexistantFile | echo ; echo "e: $? p: ${PIPESTATUS[@]}"
Run Code Online (Sandbox Code Playgroud)

预期产量:

e: 0 p: 1 0
Run Code Online (Sandbox Code Playgroud)

cat将失败(退出代码1),echo将成功(退出代码0).$?会的0. ${PIPESTATUS[0]}将包含cat(1)的退出代码和${PIPESTATUS[1]}echo(0)的退出代码.