Несколько ловушек в одном процессе - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу добавить пару функций в мой .bashrc.Функции могут выполняться долго, поэтому я хотел бы иметь возможность убить их с помощью CTRL+C и распечатать некоторую информацию, когда это произойдет.Я могу захватить CTRL+C, перехватывая SIGINT, но я не уверен, как правильно установить разные обработчики ловушек для разных функций в одном и том же скрипте (.bashrc).

Я придумалэто решение, которое, кажется, работает:

function foo()
{
    trap 'echo "foo() stopped"' SIGINT
    while true; do
        sleep 1
        echo "foo() working..."
    done
}

function bar()
{
    trap 'echo "bar() stopped"' SIGINT
    while true; do
        sleep 1
        echo "bar() working..."
    done
}

Пример вывода:

$ foo
foo() working...
foo() working...
^Cfoo() stopped

$ bar
bar() working...
bar() working...
^Cbar() stopped

Теперь мои вопросы:

  1. Правильно ли я понимаю, что каждый разЯ делаю trap ... внутри функции, она сбрасывает обработчик сигнала для всего сеанса bash (процесса)?Или он каждый раз создает новый обработчик?
  2. Это хорошее решение в целом или есть лучшее решение этой проблемы?

1 Ответ

0 голосов
/ 20 декабря 2018

Да, ловушка сбрасывает вещи глобально.Вероятно, было бы хорошо сбросить его к исходному значению, когда функция завершится.Что-то вроде:

foo() {
        old=$(trap -p SIGINT)
        trap 'echo "foo() stopped"' SIGINT
        ...
        eval set -- "$old"
        trap "$3" SIGINT
}

OTOH, возможно, более надежно запускать функцию как подоболочку, что приведет к установке только ловушки для подоболочки.Сделать это так же просто, как использовать ( и ) в определении функции:

foo()
(
    trap 'echo "foo() stopped"' SIGINT
    while true; do
        sleep 1
        echo "foo() working..."
    done
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...