Чтобы быть в безопасности, я считаю, что лучше определить функцию очистки и вызвать ее из ловушки:
cleanup() {
local pids=$(jobs -pr)
[ -n "$pids" ] && kill $pids
}
trap "cleanup" INT QUIT TERM EXIT [...]
или вообще не использовать функцию:
trap '[ -n "$(jobs -pr)" ] && kill $(jobs -pr)' INT QUIT TERM EXIT [...]
Почему? Потому что, просто используя trap 'kill $(jobs -pr)' [...]
, можно предположить, что будет фоновых заданий, запущенных при сигнале состояния прерывания. Когда нет рабочих мест, вы увидите следующее (или похожее) сообщение:
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
потому что jobs -pr
пусто - я попал в эту «ловушку» (каламбур).