Código de saída no final de um script bash

22

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 êxito e que existem muitos mais números de códigos de saída (127 se não me engano?)

Minha pergunta é sobre ao ver o código de saída 0 no final de um script, ele força o código de saída como 0, mesmo se o script falhar ou tiver outro significado?

Rebentado
fonte
2
Se um script terminar com exit 0, ele será encerrado com o código de saída 0, independentemente do que acontecer dentro do script.
Hatclock 6/09/16
@Hatclock Por que você não postou sua resposta como resposta completa? como um comentário eu não posso marcá-lo, e eu não acho que você ganha pontos falso internet para responder Apenas um pensamento ... (elogios para a resposta rápida) (certo?)
Busted
1
Estou em uma estação de trem no meu telefone, não gosto muito de digitar muito no meu telefone. O ilkkachu parece ter uma boa resposta!
Hatclock 6/09/16
2
@ Hatclock Não, de jeito nenhum. Se um script terminar exit 0, ele sairá com o código 0 somente se a última instrução foi executada. O único impacto exit 0no final do script é retornar 0 em vez do status da instrução anterior.
Gilles 'SO- stop be evil'

Respostas:

22

O comando builtin exitsai do shell ( da referência do Bash ):

exit [n]
Saia do shell, retornando um status de n ao pai do shell. Se n for omitido, o status de saída é o do último comando executado. Qualquer interceptação em EXIT é executada antes que o shell termine.

A execução para o final do arquivo também sai, retornando o código de retorno do último comando; portanto, uma final exit 0fará com que o script saia com status bem-sucedido, independentemente do status de saída dos comandos anteriores. (Ou seja, supondo que o script chegue à final exit.) No final de um script, você também pode usar trueou :obter um código de saída zero.

É claro que você usaria mais frequentemente exitde dentro de ifpara finalizar o script no meio.

Eles devem imprimir 1 ( $?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 exitfaz sentido, pois é bem possível que alguns comandos executados pelo script falhem, mas o próprio script seja bem-sucedido. Cabe ao autor do script 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. Os códigos acima de 127 são usados ​​pelo shell para indicar um processo encerrado por um sinal, mas podem ser retornados da maneira usual. A waitchamada do sistema realmente retorna um valor mais amplo, com o restante contendo os bits de status definidos pelo sistema operacional.

ilkkachu
fonte
Legal, eu não sabia sobre a numeração dos códigos de saída de 8 bits. Obrigado!
Estourado
Observe que quando um processo é interrompido, ele não sai com um código de saída> 127. É apenas que alguns shells configurados $?para 128 + signum nesse caso. Consulte Código de saída padrão quando o processo for finalizado? para detalhes.
Stéphane Chazelas
exit 0retornará apenas 0, se a saída for executada. (poderia sair por uma rota diferente).
CTRL-ALT-DELOR
18

0 significa sucesso, números 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 Código de saída padrão quando o processo for finalizado? e Quais valores de retorno / saída posso usar nas funções / scripts do bash? Para maiores 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 do que somecommandretornou. Este segundo script também pode ser escrito

#!/bin/sh
somecommand
true

Colocar exit 0no final de um script não necessariamente faz com que ele retorne 0. Isso apenas o faz retornar 0 quando o final do script é atingido. Por exemplo, o seguinte script 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 do 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 -efaz com que o script saia se somecommandfalhar:

#!/bin/sh
set -e
somecommand
exit 0
Gilles 'SO- parar de ser mau'
fonte