Подтвердить что ты не робот

Catch SIGINT в bash, дескриптор AND ignore

Возможно ли в bash перехватить SIGINT, сделать что-то, а затем проигнорировать его (сохранить bash работает).

Я знаю, что я могу игнорировать SIGINT с помощью

trap '' SIGINT

И я также могу сделать что-то на сигнете с помощью

trap handler SIGINT

Но это все равно остановит script после выполнения handler. Например.

#!/bin/bash

handler()
{
    kill -s SIGINT $PID
}

program &
PID=$!

trap handler SIGINT

wait $PID

#do some other cleanup with results from program

Когда я нажимаю ctrl + c, программа SIGINT будет отправлена, но bash пропустит wait. Программа BEFORE была правильно отключена и создала свой вывод в своем обработчике сигналов.

Используя ответ @suspectus, я могу изменить wait $PID на:

while kill -0 $PID > /dev/null 2>&1
do
    wait $PID
done

Это действительно работает для меня. Я просто не уверен на 100%, если это "чистый" или "грязный обход".

4b9b3361

Ответ 1

Ловушка

вернется из обработчика, но после команды, вызванной при вызове обработчика.

Итак, решение немного неуклюжие, но я думаю, что он делает то, что требуется. trap handler INT также будет работать.

trap 'echo "Be patient"' INT

for ((n=20; n; n--))
do
    sleep 1
done