Algumas coisas que podem fazer com que um shell saia (não exaustivo):
- chamando o utilitário
exit. Não vamos esquecer o óbvio - chamando o utilitário
return. No caso debashque retornará somente se estiver em uma função ou arquivo originado. -
%código%. Isso executará
exec cmdno mesmo processo, de modo a sair desse loop. O script terminará quandocmdsair. -
cmd/set -eestá ativado (consulte também a variável de ambienteset -o errexitparaSHELLOPTS) e um comando sai com um erro. -
bash/set -uestá ativado e uma variável não definida é referenciada. - é definida uma
set -o nounsetouDEBUGtrap que chamaERR. - Falha em especial builtins. A falha de construções especiais (como
exit,set,:...) faz com que o shell saia. No caso deeval, isso acontece apenas no modo POSIX (como quando POSIXLY_CORRECT está no ambiente ou quando chamado comobash...) e, mesmo assim, não para todos os builtins especiais. Por exemplo,shfará com que o shell saia. - como mencionado por @schily , erro de sintaxe (como no código que só é alcançado condicionalmente).
- divisão por 0 (em
: > /ou$((1/x))). - erro interno
${array[1/x]}, por exemplo, porque foi atingido algum limite:- falha ao alocar memória
- falha ao bifurcar um processo
- tamanho da pilha excedido (por exemplo, ao usar a recursão da função)
- Alguns outros limites no lugar via
bash(o que também pode fazer com que alguns sinais sejam enviados).
- morto por outro processo. Outro processo pode chamar
ulimitpara matar explicitamente o intérprete do seu script. - morto pelo sistema.
- SIGINT / SIGQUIT. Se você pressionar
kill()/^C. - SIGHUP. Se o terminal estiver desconectado.
- SIGSEGV / SIGBUS / SIGILL. O comando bash faz algo errado (um bug) ou falha de hardware (memória).
- SIGPIPE: gravação interna (
^\,echo) para um pipe ou soquete agora fechado (também pode acontecer para mensagens de erro se stderr for um pipe).
- SIGINT / SIGQUIT. Se você pressionar
A primeira coisa a verificar seria as mensagens de erro e o status de saída.