У меня есть два сценария: #! / Usr / bin / env bash sleep infinity # Когда я набираю здесь Ctrl-C, команда "sleep" и скрипт останавливаются, поэтому я не вижу "End" echo End #! / Usr / bin / env bash ...

3
Philippe 9 Янв 2021 в 18:23

1 ответ

Лучший ответ

Вот как ведет себя bash, когда его группа процессов получает SIGINT , но программа, запущенная в данный момент на переднем плане, завершается нормально. Возьмем, к примеру, эти два:

$ bash -c 'sh -c "trap true INT; sleep 10"; echo reached'
^Creached
$
$ bash -c 'sleep 10; echo reached'
^C

echo достигается в первом случае, потому что SIGINT перехватывается и обрабатывается sh (иначе было бы невозможно запустить установленную для него ловушку) и игнорируется bash, поскольку он не прервать sh, когда он прибыл.

Во втором sleep прерывается, так как он не улавливает SIGINT. Баш распознает это (используя WIFSIGNALED и WTERMSIG), сбрасывает обработчик SIGINT по умолчанию и сигнализирует самому себе, что нужно выполнить завершение, вызванное SIGINT.

Обоснование такого поведения приводится здесь. следующее:

Основная идея состоит в том, что пользователь намеревается сгенерированный клавиатурой SIGINT перейти к процессу переднего плана; этот процесс должен решить, как с этим справиться; и bash реагирует соответственно. Если процесс умирает из-за SIGINT, bash действует так, как если бы он получил SIGINT; в противном случае bash предполагает, что процесс обработал его, и игнорирует его.

Рассмотрим процесс (обычный пример - emacs), который использует SIGINT для своих собственных целей как обычную часть работы. Если вы запускаете эту программу в сценарии, вы не хотите, чтобы оболочка неожиданно прервала выполнение сценария в результате.

4
oguz ismail 11 Янв 2021 в 09:47