Significado da saída 0, saída 1 e saída 2 em um script bash

49

Estou fazendo alguns exercícios práticos.

Escreva um script que receberá um número de mês como argumento e traduza esse número para o nome de um mês. O resultado será impresso em stdout.

Eu fiz uma solução:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

O que significa exit 1, exit 0e exit 2significa, e por que os usamos?

andrej benedičič
fonte
5
Um código executado com sucesso deve sair com o código 0. Outros valores indicam um erro. Ver, por exemplo Códigos de saída com significados especiais
V. Olsen
2
Um script bash é como uma sala de cinema, existem diferentes. As instruções de saída marcam o local das saídas para o intérprete do bash. Quando o script é disparado, o intérprete deve executar até a saída mais próxima.
DepressedDaniel
5
Se esse é o código que você escreveu, por que você usou declarações que você nem entende?
Dmitry Grigoryev
5
1) Você aceitou uma resposta logo após postar a pergunta. Dê 24 horas para esperar respostas ainda melhores. 2) A resposta aceita é errada e enganosa. A resposta correta é "não há significado padrão para os códigos de saída (além de 0 = sucesso); você como desenvolvedor de scripts define a semântica". 3) Se você criou esse script, por que adicionou os comandos de saída (todos são logicamente supérfluos ou podem ser recolhidos para "exit 1" desde que você use o if-else).
AnoE

Respostas:

58

Aqui está uma boa referência para códigos de saída do shell :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Advertência: Usar o código de saída adequado não é um requisito e não é imposto pelo shell. Os desenvolvedores podem ignorar a orientação, se acharem sábio.

user535733
fonte
8
Tenha cuidado, no entanto. O que significa um código de saída depende inteiramente dos desenvolvedores do programa.
Muru
Além disso, enquanto a fonte vinculada, o Advanced Bash Scripting Guide, afirma mostrar " Códigos de saída reservados " (ênfase no original), essa afirmação é não citada e totalmente falsa .
Eliah Kagan
23

Usar exite um número é uma maneira útil de sinalizar o resultado do seu script. Ele imita a maneira como os comandos bash produzem um código de retorno. Com os comandos bash, o código de retorno 0 geralmente significa que tudo foi executado com êxito, sem erros. exittambém faz com que seu script pare a execução nesse ponto e retorne à linha de comando.

Qualquer código de retorno maior que 0 indica algum tipo de erro, embora às vezes o erro não seja crítico, para cada comando deve ser possível encontrar alguma documentação que informe o que significa cada código de retorno.

Você pode obter o código de retorno do último comando bash usando a variável shell da seguinte $?maneira:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Quando você usa isso em um script, pode consultar o código de retorno da mesma maneira quando terminar de executar. Então você verá que tendo:

exit 2
exit 0

É meio sem sentido, pois você nunca pode alcançar a exit 0parte.

Arronical
fonte
3

Por si só, exitimplica um valor de saída zero ou conclusão bem-sucedida do seu script. Você não precisa adicionar o argumento zero ao comando exit para indicar a conclusão bem-sucedida. Seu script pode (ou provavelmente sairá) com êxito, embora teste uma condição incorreta. Nesse caso, você deseja especificamente que saia com a condição de erro (ou 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

O exitcomando na última linha não precisa estar lá. Pode ser chamado com o zero ou não chamado. Sem especificar o argumento 1 para o comando exit, a resposta em todos esses casos para o echo $?seria zero.

No entanto, especificando o argumento 1 para o comando exit, a resposta para echo $?seria 1. Portanto, use o argumento 1 para o comando exit quando desejar especificar que o script foi encerrado com uma condição de erro.

geekasaurus
fonte