прекратить текущий запуск bash скрипт лениво / грациозно - PullRequest
1 голос
/ 01 апреля 2020

Скажем, у меня есть скрипт bash, подобный этому:

#!/bin/bash
exec-program zero
exec-program one

скрипт выдал команду запуска exe c -программы с аргументом "ноль", верно? скажем, например, первая строка в настоящее время работает. Я знаю, что Ctrl- C остановит процесс и прекратит выполнение оставшейся части сценария.

Вместо этого есть нажатие клавиши, которое позволит текущей строке завершить выполнение sh и затем прекратить выполнение сценария (не выполнять "exe c -program one") (без непосредственного изменения сценария) )? В этом примере он продолжит выполнение «exe c -программы ноль», но после этого вернется в оболочку, а не сразу остановит «exe c -программа ноль»

TL; DR Что-то время выполнения, похожее на « Ctrl- C ", но более ленивый / изящный ??

1 Ответ

2 голосов
/ 01 апреля 2020

На странице руководства в разделе СИГНАЛЫ это выглядит следующим образом:

Если bash ожидает завершения команды и получает сигнал, для которого установлена ​​ловушка, ловушка не будет выполняться до тех пор, пока команда не завершится.

Это именно то, что вы просите. Вам нужно установить выходную ловушку для SIGINT, а затем запустить exec-program в подоболочке, где SIGINT игнорируется; так что он унаследует обработчик SIG_IGN и Ctrl + C не убьет его. Ниже приведена реализация этой концепции.

#!/bin/bash -
trap exit INT
foo() (
  trap '' INT
  exec "$@"
)

foo sleep 5
echo alive

Если вы нажмете Ctrl + C во время работы sleep 5, bash будет ожидать его завершения и затем завершится; вы не увидите alive на терминале.

exec предназначен для того, чтобы избежать другого форка () между прочим.

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