$? 4の代わりにエラーレベル0を返します。

$? 4の代わりにエラーレベル0を返します。

動作しているWindowsバッチスクリプト(.bat)をUnixシェルに移行しました。一般的に言うとうまくいきますが、Unixで返されるエラーレベルが間違っていることに気づきました。

私が知る限り、WindowsのコマンドはUnixのコマンド%errorlevel%に「変換」されます。$?ただし、Windows Batchスクリプトは通常、スクリプトから呼び出されたJavaアプリケーションの実行中にエラーが発生した場合にエラーレベル4を返します。

Unix は$?4 の代わりに 0 を返すので、自動エラーチェックにより、実際にエラーのあるアプリケーションが正常に実行されると解釈されます。

Unixが正しいエラーレベルを返すようにするにはどうすればよいですか?私が知っている限り、エラーが発生した場合は、実際には0より大きい値を返す必要があります。

これは私のシェルスクリプトです。

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

おすすめ記事