Quebra de funções aninhadas em um shell

0

Se eu tiver uma série de funções aninhadas, como posso sair de todas elas da função mais interna?

EDIT: Busy olhando para a armadilha construída '...

    
por jabalsad 06.03.2013 / 17:22

3 respostas

1

Uma maneira bastante feia mas fácil de conseguir isso seria definir a variável STOP e verificá-la após cada chamada de função:

a ()
{
    echo a
    b; [[ "$STOP" == 1 ]] && return
    a; [[ "$STOP" == 1 ]] && return
}

b ()
{
    echo b
    c; [[ "$STOP" == 1 ]] && return
    b; [[ "$STOP" == 1 ]] && return
}

c ()
{
    echo c
    STOP=1; return
}

a
echo d

Não é bonito, mas funciona em bash e zsh.

    
por 06.03.2013 / 17:52
1

Aqui está um hack não necessariamente portátil que salta de todos os níveis requeridos ignorando todos os RETURN traps, evita efetivamente retornar qualquer coisa exceto 0, e é possivelmente um bug em pelo menos alguns aspectos. Esta implementação em particular é apenas Bash, mas pode ser adaptada a outras shells.

function f {
    printf 'Current level: %d\n' ${n:+"$1"}
    if [[ $FUNCNAME != "${FUNCNAME[1]}" ]]; then
        [[ $1 == +([[:digit:]]) ]] || return 1
        typeset n=$1
        while ! f 1; do :; done
        unset -v n
    elif (( n - $1 )); then
        f $(($1 + 1))
    else
        trap 'printf "Returning from level: %d\n" ${n+"$1"}' RETURN
        # return # toggle
        break
    fi
}

f "${1:-5}"

saída

Current level: 0
Current level: 1
Current level: 2
Current level: 3
Current level: 4
Current level: 5
Returning from level: 0
    
por 06.03.2013 / 18:41
0

Eu fui com o armazenamento de toda a lógica em um script de shell separado, em vez de usar funções. A saída sairá do script completamente e permitirá que o script do wrapper continue a execução.

    
por 06.03.2013 / 18:20

Tags