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

22

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

(Представьте, что есть сценарий, который выполняет некоторую длительную команду. Пользователь нажимает ctrl+ cи прерывает команду, но сценарий продолжается.) Мне нужно, чтобы он вел себя так, что они оба убиты.

kolypto
источник
1
Если в вашей ОС включен контроль заданий, другой вариант - остановить этот скрипт (обычно с помощью crtl-z). Вы можете продолжить эту работу в фоновом режиме bg, убить ее или продолжить в переднем плане fg. Смотрите раздел руководства по bash JOB CONTROL.
ot--

Ответы:

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
Kvisle
источник
2
Обратите внимание, что вы также можете заманивать EXITв ловушку в случаях, когда у вас есть что-то, что вы хотите выполнить в любое время, когда скрипт завершает работу независимо от того, как он остановился. (за KILLисключением, конечно.)
Blrfl
Большое спасибо! Тем не менее, когда «сон» убит - оболочка все еще может выполнить следующую команду во время выполнения процедуры прерывания: в данном случае «эхо» ... или я ошибаюсь?
Колыпто
Это не должно быть возможно, нет. Он не выполняет задачи параллельно.
Kvisle