Если у меня есть ряд вложенных функций, как я могу отделить их от самой внутренней функции?

РЕДАКТИРОВАТЬ: занят, глядя в встроенную «ловушку» ...

3 ответа3

1

Довольно уродливый, но простой способ добиться этого - определить переменную STOP и проверять ее после каждого вызова функции:

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

Не красиво, но работает в bash и zsh.

1

Вот не обязательно переносимый хак, который выпрыгивает из всех необходимых уровней, минуя все ловушки RETURN , эффективно предотвращает возврат чего-либо, кроме 0, и, возможно, является ошибкой по крайней мере в некоторых отношениях. Эта конкретная реализация предназначена только для Bash, но может быть адаптирована для других оболочек.

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}"

выход

Current level: 0
Current level: 1
Current level: 2
Current level: 3
Current level: 4
Current level: 5
Returning from level: 0
0

Я пошел с сохранением всей логики в отдельном сценарии оболочки вместо использования функций. Выход полностью выйдет из сценария и позволит вашему сценарию-оболочке продолжить выполнение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .