Sair do código no final de um script bash

16

Estou confuso sobre o significado do código de saída no final de um script bash: Eu sei que o código de saída 0 significa que ele foi concluído com sucesso e que existem muitos mais códigos de saída (127, se não estou enganado?)

A minha pergunta é sobre quando ver código de saída 0 no final de um script, forçar o código de saída como 0, mesmo que o script falhou ou tem outro significado?

    
por Busted 06.09.2016 / 16:20

2 respostas

15

O comando interno exit sai do shell (de Referência de Bash ):

exit [n]
Exit the shell, returning a status of n to the shell’s parent. If n is omitted, the exit status is that of the last command executed. Any trap on EXIT is executed before the shell terminates.

A execução até o final do arquivo também sai, retornando o código de retorno do último comando, portanto, sim, um% final exit 0 fará o script sair com status bem-sucedido, independentemente do status de saída dos comandos anteriores. (Ou seja, assumindo que o script atinja o% final% co_de.) No final de um script, você também pode usar exit ou true para obter um código de saída igual a zero.

É claro que você usaria com mais frequência : de dentro de um exit para finalizar o script no meio.

Estes devem imprimir um 1 ( if contém o código de saída retornado pelo comando anterior):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Enquanto isso deve imprimir um 0:

sh -c "false; exit 0" ; echo $?

Não tenho certeza se o conceito do script "falhando" ao executar um $? faz sentido, já que é bem possível que alguns comandos executados pelo script falhem, mas o próprio script seja bem-sucedido. Cabe ao autor do roteiro decidir o que é um sucesso e o que não é.

Além disso, o intervalo padrão para códigos de saída é 0..255. Códigos acima de 127 são usados pelo shell para indicar um processo terminado por um sinal, mas eles podem ser retornados da maneira usual. A chamada do sistema exit na verdade retorna um valor mais amplo, com o restante contendo bits de status definidos pelo sistema operacional.

    
por 06.09.2016 / 16:42
14

0 significa sucesso, inteiros positivos significam falha. Existem 255 códigos de erro diferentes, mas os valores 126 e acima são reservados para indicar que um programa não pôde ser iniciado (126 ou 127) ou foi morto por um sinal (129 e acima). Consulte o código de saída padrão quando o processo é encerrado? e Voltar / exit valores posso usar em bash functions / scripts? para mais informações.

O status de saída de um script de shell é o status de saída do último comando que o script executou. Então, por exemplo

#!/bin/sh
somecommand

retorna o status de saída de somecommand , enquanto

#!/bin/sh
somecommand
exit 0

retorna 0, independentemente de qual somecommand retornou. Este segundo script também pode ser escrito

#!/bin/sh
somecommand
true

Colocar exit 0 no final de um script não necessariamente faz com que ele retorne 0. Isso só faz com que ele retorne 0 quando o final do script é atingido. Por exemplo, o script a seguir sempre retorna 3:

#!/bin/sh
exit 3
exit 0

O script a seguir também sempre retorna um código de erro, além de exibir uma mensagem sobre um erro de sintaxe:

#!/bin/sh
}
exit 0

O script a seguir retorna 1 ou 0, dependendo de seu primeiro argumento:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

O script a seguir retorna o status de somecommand , pois set -e faz o script sair se somecommand falhar:

#!/bin/sh
set -e
somecommand
exit 0
    
por 07.09.2016 / 02:33