Ctrl-C у скриптах bash


22

Як я реалізую ctrl+ cобробку в bash-скриптах, щоб скрипт був перерваний, а також запущена в даний час команда, запущена сценарієм?

(Уявіть собі , що є сценарій , який виконує деякі довгограючих команди. СЗппи користувачів ctrl+ cі перериває команду, але доходи сценарію.) Мені потрібно вести себе таким чином , що вони обидва загинули.


1
Якщо у вашій ОС увімкнено контроль роботи, іншим варіантом було б зупинити цей скрипт (як правило, з crtl-z). Ви можете продовжити цю роботу у фоновому режимі bg, вбити або продовжити її на передньому плані fg. Дивіться розділ "bash manpage" JOB CONTROL.
ott--

Відповіді:


25

Виконуєте це, створивши підпрограму, яку ви хочете зателефонувати, коли буде отримано SIGINT, і вам потрібно запустити trap 'subroutinename' INT.

Приклад:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
Зауважте, що ви також можете вловлюватись EXITу випадках, коли у вас є щось, що ви хочете виконати в будь-який час, коли сценарій виходить незалежно від того, як він зупинився. ( KILLвиключається, звичайно.)
Blrfl

Щиро дякую! Однак, коли "сон" вбито - оболонка все-таки зможе керувати виконанням наступної команди, поки виконується звичайна пастка: "відлуння" в цьому випадку ... або я помиляюся?
колипто

Це не повинно бути можливим, ні. Він не виконує завдання паралельно.
Kvisle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.