Порядок выполнения ловушек в bash - PullRequest
0 голосов
/ 21 октября 2019

Рассмотрим код:

#!/bin/bash

trap 'echo EXIT' EXIT
trap 'echo ERR' ERR

false

Как узнать порядок выполнения ловушек? Легко рутировать скрипт и проверять его, но я ничего не могу найти в документации. Вы видели что-нибудь?

1 Ответ

3 голосов
/ 21 октября 2019

Как подсказывает @oguz_ismail, порядок соответствует событиям.

Например, если вы управляете SIGINT и EXIT следующим образом:

#!/bin/bash

__die() { :;}
__ctrl_c() { :;}

trap __die EXIT
trap __ctrl_c INT

Вв случае SIGINT (EG C-c нажата или kill -2 "${pid}"), вы всегда будете выполнять __ctrl_c до __die (если вы не заставите его иначе).

В качестве наилучшей практики я обычно пересылаюсигнал:

#!/bin/bash

__ctrl_c() {
  printf "%b" "\n" >&2
  printf "Interrupted by user ):\n"
  # Avoid looping deleting trap
  trap 2
  # Resend sigint
  kill -2 "$$"
}

trap __ctrl_c INT

Вы можете увидеть список сигналов с помощью trap -l (по крайней мере, от bash 5) или kill -l.

Если вам нужен какой-то определенный «шаблон» дляследуя ловушкам, вы можете форсировать сигнал с помощью kill -signal $$.

Например, в __ctrl_c вы можете отправить kill -15 $$ для вызова SIGTERM

Вы можете прочитать сигнал (7) и sigaction (2) для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...