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

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

  • Se um script terminar com exit 0, ele sairá com o código de saída 0, independentemente do que acontecer no script.
  • @Hatclock por que não ' você postou sua resposta como uma resposta prometida completa? como um comentário, não posso marcá-la e não ' não acho que você ganhe pontos de Internet falsos por responder (certo?) Apenas uma ideia. .. (parabéns pela resposta rápida)
  • Eu ' m em uma estação de trem no meu telefone, eu não realmente gosto de digitar muito no meu telefone. ilkkachu parece ter uma boa resposta, entretanto!
  • @Hatclock Não, de forma alguma. Se um script terminar com exit 0, ele sairá com o código 0 apenas se a última instrução tiver sido executada. O único impacto de exit 0 no final do script é retornar 0 em vez do status da instrução anterior.
  • @Gilles Isso foi mais ambíguo resposta redigida da minha parte. Se um script executar exit 0 em qualquer ponto, ele retornará o código de saída 0, independentemente do que aconteceu antes disso.

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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *