Saia do script shell na função de tratamento de erros sem sair do terminal

Saia do script shell na função de tratamento de erros sem sair do terminal

Estou escrevendo um script de shell. Esse script de shell é executado em um bashshell dentro de um terminal. Ele contém uma função central de tratamento de erros. Consulte o seguinte trecho de demonstração básico:

function error_exit
{
   echo "Error: ${1:-"Unknown Error"}" 1>&2
   exit 1 # This unfortunately also exits the terminal
}

# lots of lines possibly calling error_exit
cd somewhere || error_exit "cd failed"
rm * || error_exit "rm failed"
# even more lines possibly calling error_exit

A função manipuladora de erros deve encerrar o script, mas NÃO deve encerrar o terminal. Como posso conseguir isso?

Responder1

Use o builtin bashdo trappara gerar uma bashinstância na saída do script:

trap 'bash' EXIT

De help trap:

trap: trap [-lp] [[arg] signal_spec ...]
    Trap signals and other events.

    Defines and activates handlers to be run when the shell receives signals
    or other conditions.

    ARG is a command to be read and executed when the shell receives the
    signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC
    is supplied) or `-', each specified signal is reset to its original
    value.  If ARG is the null string each SIGNAL_SPEC is ignored by the
    shell and by the commands it invokes.

    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.

Portanto, executando trap 'bash' EXIT, bashserá lido e executado quando o shell receber o sinal EXIT; gerar um shell interativo terá, consequentemente, o efeito de impedir o fechamento do terminal:

function error_exit
{
   echo "Error: ${1:-"Unknown Error"}" 1>&2
   exit 1 # This unfortunately also exits the terminal
}

trap 'bash' EXIT
# lots of lines possibly calling error_exit
cd somewhere || error_exit "cd failed"
rm * || error_exit "rm failed"
# even more lines possibly calling error_exit

informação relacionada