Sair do shell script na função handle de erro sem sair do terminal

1

Estou escrevendo um script de shell. Esse script de shell é executado em um shell bash dentro de um terminal. Ele contém uma função central de tratamento de erros. Consulte o seguinte snippet 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 de tratamento de erros deve terminar o script, mas NÃO deve terminar o terminal. Como posso conseguir isso?

    
por Silicomancer 10.10.2015 / 21:52

1 resposta

1

Use bash do trap incorporado para gerar uma instância bash 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 , bash será lido e executado quando o shell receber o sinal EXIT; gerar um shell interativo consequentemente terá 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
    
por kos 10.10.2015 / 22:07