De um script de shell, execute outro com argumentos e obtenha seu código de retorno

2

Em uma CPU dual i686 / 32-bit, com uma nova instalação do Debian Stretch, eu instalei o Octave 4.2.1 e execute ./mytest depois de fornecer privilégios de execução:

#!/bin/bash
./mytest.m

onde test.m

#!/usr/bin/octave
exit(0)

Considerando os dois scripts armazenados em ~/tmp , mytest

#!/bin/bash

if $1/mytest.m "$2"; then
  echo "good"
else
  echo "bad"
fi

e mytest.m

#!/usr/bin/octave

param = argv(){1};

if strcmp(param, "happyend")
  exit(0)
else
  exit(1)
end

A execução de tmp/mytest tmp happyend passará happyend normalmente para mytest e subseqüentemente para mytest.m , que passará o sinal 0 de volta para mytest , que será impresso como 'bom'. Agora, como obter o código de retorno (saída) de mytest.m em uma variável? (0 no exemplo acima).

A opção intuitiva

#!/bin/bash

result=$("$1"/mytest.m "$2")

if [ $result = 0 ]; then
  echo "good"
else
  echo "bad"
fi

não funciona.

    
por nightcod3r 28.07.2017 / 16:59

1 resposta

5

Para obter o código de retorno (saída) de um comando, você precisa salvar o valor $? , talvez em uma variável chamada result :

"$1/mytest.m" "$2"
result=$?
if [ "$result" -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi

Se você quiser salvar o resultado por tempo suficiente para testá-lo, pule a variável result com:

"$1/mytest.m" "$2"
if [ $? -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi

mas tenha o cuidado de testar imediatamente $? depois de executar o mytest.m, pois qualquer comando subseqüente colocará o código de retorno em $? .

Se você quiser apenas testar se o resultado é zero, não precisa tratá-lo como um inteiro. Apenas trate o comando como um condicional.

if "$1/mytest.m" "$2"; then
  echo "good"
else
  echo "bad"
fi
    
por 28.07.2017 / 17:42