Estou confuso sobre o significado do código de saída no final de um script bash: eu conheço o código de saída 0 significa que foi concluído com sucesso e que existem muitos mais números de códigos de saída (127 se não me engano?)
Minha pergunta é sobre quando ver o código de saída 0 no final de um script, força o código de saída como 0 mesmo se o script falhar ou tiver outro significado?
Comentários
Resposta
O comando embutido exit
sai do shell (de Bash “s referência ):
exit [n]
Sai do shell, retornando um status de n para o pai do shell. Se n for omitido, o status de saída é o do último comando executado. Qualquer trap em EXIT é executado antes do shell terminar.
Correndo para o final do arquivo também sai, retornando o código de retorno do último comando, então sim, um exit 0
final fará com que o script saia com status de sucesso, independentemente do status de saída de os comandos anteriores. (Isto é, supondo que o script alcance o exit
final.) No final de um script, você também pode usar true
ou para obter um código de saída zero.
É claro que com mais frequência você” d usará exit
de dentro de um if
para terminar o script no meio.
Devem imprimir um 1 ($?
contém o código de saída retornado pelo comando anterior) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Embora deva imprimir um 0:
sh -c "false; exit 0" ; echo $?
Eu não certifique-se de que o conceito de “falha” do script ao executar um exit
faz sentido, pois é bem possível que alguns comandos executados pelo script falhem, mas o próprio script tenha sucesso . Cabe ao autor do script decidir o que é bem-sucedido 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 wait
chamada do sistema realmente retorna um valor mais amplo, com o restante contendo bits de status definidos pelo sistema operacional.
Comentários
- Legal, eu não ' não sabia sobre a numeração dos códigos de saída de 8 bits. Obrigado!
- Observe que quando um processo é eliminado, ele não sai com um código de saída > 127. Ele ' s que alguns shells definem
$?
para 128 + signum nesse caso. Consulte Código de saída padrão quando o processo for encerrado? para obter detalhes. -
exit 0
retornará apenas 0, se a saída for executada. (poderia sair por uma rota diferente).
Resposta
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 “iniciar (126 ou 127) ou foi eliminado por um sinal (129 e acima). Consulte Código de saída padrão quando o processo é encerrado? e Quais valores de retorno / saída posso usar em funções / scripts bash? para obter mais informações.
O status de saída de um script de shell é o status de saída do último comando executado pelo script. Por exemplo,
#!/bin/sh somecommand
retorna o status de saída de somecommand
, enquanto
#!/bin/sh somecommand exit 0
retorna 0 independentemente do que somecommand
retornado.Este segundo script também pode ser escrito
#!/bin/sh somecommand true
Colocar exit 0
no final de um script não causa necessariamente para retornar 0. Isso faz com que ele retorne apenas 0 quando o final do script for atingido. Por exemplo, o script a seguir sempre retorna 3:
#!/bin/sh exit 3 exit 0
O o script a seguir 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
, desde set -e
faz com que o script saia se somecommand
falhar:
#!/bin/sh set -e somecommand exit 0
exit 0
, ele sairá com o código de saída 0, independentemente do que acontecer no script.exit 0
, ele sairá com o código 0 apenas se a última instrução tiver sido executada. O único impacto deexit 0
no final do script é retornar 0 em vez do status da instrução anterior.exit 0
em qualquer ponto, ele retornará o código de saída 0, independentemente do que aconteceu antes disso.