Significado de exit 0, exit 1 e exit 2 em um script bash

20

Estou fazendo alguns exercícios práticos.

  

Escreva um script que receberá um número de mês como o argumento e converterá esse número em um nome de mês. O resultado será impresso no 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=
   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 0 e exit 2 e por que os usamos?

    
por andrej benedičič 13.03.2017 / 16:15

3 respostas

27

Aqui está uma boa referência para os 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() {}

Ressalva: 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 que é sensato.

    
por user535733 13.03.2017 / 16:20
19

Usar exit e um número é uma maneira útil de sinalizar o resultado do seu script. Ele imita a maneira como os comandos bash emitem um código de retorno. Com os comandos bash, o código de retorno 0 geralmente significa que tudo foi executado com sucesso sem erros. exit també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 um erro de algum tipo, embora às vezes o erro não seja crítico; para cada comando, deve ser possível encontrar alguma documentação que informe o significado de cada código de retorno.

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

$ 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, você pode consultar o código de retorno da mesma maneira quando ele é executado. Então você verá que:

exit 2
exit 0

É um pouco sem sentido, já que você nunca pode alcançar a parte exit 0 .

    
por Arronical 13.03.2017 / 16:24
3

Por si só, exit implica um valor de saída igual a zero ou a 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 irá) sair com sucesso, embora teste para uma condição errada. Neste caso, você quer 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 comando exit na última linha não precisa estar lá. Pode ser chamado com o zero ou não ser chamado. Sem especificar o argumento 1 para o comando de saída, a resposta em todos esses casos para o echo $? seria zero.

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

    
por geekasaurus 13.03.2017 / 21:04

Tags