У меня довольно длинный сценарий оболочки, и я пытаюсь добавить к нему обработку сигналов.
Основная задача сценария - запускать различные программы, а затем очищать их временные файлы.
Я хочу поймать SIGINT.Когда сигнал пойман, сценарий должен дождаться завершения выполнения текущей программы, затем выполнить очистку и выйти.
Вот MCVE:
#!/bin/sh
stop_this=0
trap 'stop_this=1' 2
while true ; do
result="$(sleep 2 ; echo success)" # run some program
echo "result: '$result'"
echo "Cleaning up..." # clean up temporary files
if [ $stop_this -ne 0 ] ; then
echo 'OK, time to stop this.'
break
fi
done
exit 0
Ожидаемый результат:
Cleaning up...
result: 'success'
Cleaning up...
^Cresult: 'success'
Cleaning up...
OK, time to stop this.
Фактический результат:
Cleaning up...
result: 'success'
Cleaning up...
^Cresult: ''
Cleaning up...
OK, time to stop this.
Проблема в том, что текущая выполняемая инструкция (в данном случае result="$(sleep 2 ; echo success)"
) прерывается.Что я могу сделать, чтобы он вел себя больше, как если бы я был установлен trap '' 2
?
Я ищу либо решение POSIX, либо решение, которое поддерживается большинством интерпретаторов оболочки (BusyBox, dash, Cygwin ...)
Я уже видел ответы для Запретить SIGINT закрывать дочерний процесс в скрипте bash , но на самом деле это не работает для меня.Все эти решения требуют модификации каждой строки, которая не должна прерываться.Мой настоящий сценарий довольно длинный и намного сложнее, чем пример.Мне бы пришлось изменить сотни строк.