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 debash
que retornará somente se estiver em uma função ou arquivo originado. -
%código%. Isso executará
exec cmd
no mesmo processo, de modo a sair desse loop. O script terminará quandocmd
sair. -
cmd
/set -e
está ativado (consulte também a variável de ambienteset -o errexit
paraSHELLOPTS
) e um comando sai com um erro. -
bash
/set -u
está ativado e uma variável não definida é referenciada. - é definida uma
set -o nounset
ouDEBUG
trap 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,sh
fará 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
ulimit
para 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.