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

时间:2012-11-30 23:25:14

标签: java bash error-handling

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

ULogger.info("throwing out 666!");
System.exit(666);

bash包装器:

eval ${COMMAND_TO_RUN}
ret_code=$?
printf "error code : [%d]" ${ret_code}

输出:

[2012-11-30 15:20:12,971][INFO ] throwing out 666!
error code : [0]
这是什么交易?感谢...

[编辑]

${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

2 个答案:

答案 0 :(得分: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

最后一个名为tee的程序将以状态0退出,覆盖退出 价值java

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

例如:

$ cat nonexistantFile | echo ; echo "e: $? p: ${PIPESTATUS[@]}"

预期产出:

e: 0 p: 1 0

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

答案 1 :(得分:-2)

这是因为$?几乎肯定会给你eval的返回代码,这是在这里成功的。你为什么要在那里加入eval电话?只需拨打COMMAND_TO_RUN

即可