$?返回错误级别 0 而不是 4

$?返回错误级别 0 而不是 4

我刚刚将一个可用的 Windows 批处理脚本 (.bat) 迁移到 Unix Shell。一般来说,它工作得很好,但是,我刚刚意识到 Unix 中返回的错误级别是错误的。

据我所知,%errorlevel%Windows 中的命令“翻译”为$?Unix 中的命令。但是,当脚本中调用的 Java 应用程序执行期间发生错误时,Windows Batch 脚本通常会返回错误级别 4。

Unix$?返回 0 而不是 4,这导致我的自动错误检查将实际有错误的应用程序解释为成功运行。

如何让 Unix 返回正确的错误级别?据我所知,当发生错误时它实际上应该返回值> 0...

这是我的 shell 脚本:

JAVA_HOME="/usr/lib/jvm/java"
EXECUTABLE="my.java.executable"

BASEDIR=`dirname $0`
cd $BASEDIR

LOCAL_CP=$BASEDIR

for f in `find $BASEDIR/lib -type f -name "*.jar"` `find $BASEDIR/lib -type f -name "*.zip"`
do
  LOCAL_CP=$LOCAL_CP:$f
done

# various variables being assigned

VMARGS="-various -vmargs -assigned -here"

$JAVA_HOME/bin/java $VMARGS -cp $LOCAL_CP $EXECUTABLE $various_variables

echo $status
echo ERRORLEVEL: $?

以及来自 Java 应用程序的日志。请注意最后返回的错误级别为 0:

2016/08/22 20:00:22 - Start XXX (stdout) - java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:xxx, moduleName:xxx-ejb-generic, distinctName:] combination for invocation context org.xxx.EJBClientInvocationContext@50a638b5
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.EJBClientContext.requireEJBReceiver(EJBClientContext.java:727)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:183)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.sendRequestWithPossibleRetries(EJBInvocationHandler.java:253)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.doInvoke(EJBInvocationHandler.java:198)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.doInvoke(EJBInvocationHandler.java:181)
2016/08/22 20:00:22 - Start XXX (stdout) - at org.xxx.invoke(EJBInvocationHandler.java:144)
2016/08/22 20:00:22 - Start XXX (stdout) - at com.sun.proxy.$Proxy2.evalWorkflowStatus(Unknown Source)
2016/08/22 20:00:22 - Start XXX (stdout) - at xxx.ejb.workflow.test.ClientAsyncComStrategy.startWorkflow(ClientAsyncComStrategy.java:83)
2016/08/22 20:00:22 - Start XXX (stdout) - at xxx.ejb.workflow.test.yyy.startWorkflow(yyy.java:219)
2016/08/22 20:00:22 - Start XXX (stdout) - at xxx.ejb.workflow.test.yyy.main(yyy.java:132)
2016/08/22 20:00:22 - Start XXX (stdout) - 
2016/08/22 20:00:22 - Start XXX (stdout) - null
2016/08/22 20:00:22 - Start XXX (stdout) - ERRORLEVEL: 0

预先感谢您给我的任何提示!

答案1

您的echo命令设置其自己的状态:

echo $status
echo ERRORLEVEL: $?

如果你想保留它,你应该将它保存到一个变量中:

rc=$?
echo $status
echo ERRORLEVEL: $rc
exit $rc

相关内容