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%, если это "чистый" или "грязный обход".
Ответы
Ответ 1
Ловушка вернется из обработчика, но после команды, вызванной при вызове обработчика.
Итак, решение немного неуклюжие, но я думаю, что он делает то, что требуется. trap handler INT
также будет работать.
trap 'echo "Be patient"' INT
for ((n=20; n; n--))
do
sleep 1
done