$? retorna errorlevel 0 em vez de 4

0

Acabei de migrar um script do Windows Batch (.bat) para o Unix Shell. Geralmente está funcionando muito bem, mas acabei de perceber que o errorlevel retornado no Unix está errado.

Pelo que eu li, o comando %errorlevel% do Windows "traduz" para $? no Unix. No entanto, o script do Windows Batch costumava retornar um nível de erro de 4 quando ocorreu um erro durante a execução do aplicativo Java chamado no script.

Unix $? retorna 0 em vez de 4, o que faz com que minha verificação de erro automatizada interprete a execução realmente incorreta do aplicativo como um sucesso.

Como posso fazer o Unix retornar o erro errorlevel? Pelo que pude perceber, ele deve retornar valores > 0 quando ocorre um erro ...

Aqui está o meu script de 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: $?

E o log do aplicativo Java. Observe o nível de erro retornado como 0 no final:

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

Agradecemos antecipadamente por qualquer dica que você possa me dar!

    
por daZza 23.08.2016 / 10:36

1 resposta

5

Seu comando echo define seu próprio status:

echo $status
echo ERRORLEVEL: $?

Se você quiser retê-lo, salve-o em uma variável:

rc=$?
echo $status
echo ERRORLEVEL: $rc
exit $rc
    
por 23.08.2016 / 10:43