Por que o código de saída de um script parece ter um valor diferente do que é retornado?

3

Eu tenho um script (run-docker-container.sh) que chama outro script (create-docker-container.sh). O create-docker-container executa um script curl com a API remota do docker e retorna o código http ou zero se for bem-sucedido. O script de criação retorna assim,

echo $RVAL
exit $RVAL

e nos meus testes tem o valor de $ RVAL como 404, o valor em que estou interessado nesta questão.

No meu script do contêiner run-docker, tenho as seguintes linhas

create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS
rval=$?
echo $rval
if [ $rval -eq 404 ]; then
    ...
fi

mesmo que a criação pareça estar saindo com 404, o valor que estou recebendo para $? é 148 e, portanto, meu tratamento de condição não está sendo chamado. Por que isso seria e como obter corretamente o código de saída do script?

    
por Kevin Milner 17.03.2016 / 17:15

1 resposta

3

Por razões históricas, o status de saída de um processo é um número de 8 bits. O número que você passa para exit é reduzido no módulo 256 (2⁸).

Além disso, os valores 126 e acima têm um significado convencional, indicando uma falha ao iniciar o programa (126 ou 127) ou um programa que foi morto por um sinal (128 e acima). Então, enquanto você pode retornar esses valores, você não deve a menos que você queira simular essas condições.

A regra é retornar 0 para sucesso e algum outro valor para indicar erros. Esta é uma regra na medida em que muitas ferramentas interpretam 0 como sucesso: comandos condicionais como if e while , ferramentas que anulam erros como scripts de shell sob set -e e makefiles, etc.

Em relação a erros, as convenções mais comuns são retornar 1 em qualquer erro ou retornar 2 em qualquer erro. A terceira convenção comum é retornar 1 em uma falha esperada (por exemplo, um comando de pesquisa que não encontra nada) e 2 em uma falha inesperada (por exemplo, o arquivo a ser pesquisado não existe). Se você precisar mapear os códigos de erro HTTP para o status de saída, você terá o intervalo de 1 a 125 para jogar (com 200 mapeamentos de sucesso para 0), não há um padrão para isso.

    
por 18.03.2016 / 01:31