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

관련 정보