это, вероятно, будет (я должен проверить, чтобы быть уверенным), но в любом случае вы можете сохранить PID разветвленных процессов и убить их при выходе:
my_forked_process & my_forked_pid=$!
так как вы сказали "другие оболочки", я бы предположил, что есть несколько, поэтому мы должны использовать массив:
my_forked_pids=()
my_forked_process1 & my_forked_pids+=($!)
my_forked_process2 & my_forked_pids+=($!)
затем вы убиваете их вот так при выходе:
for pid in "${my_forked_pids[@]}"; do
kill "$pid"
done
[бонус], если вы оберните предыдущую функцию, вы можете установить trap
для ее запуска при выходе из скрипта независимо от момента (безопасность, когда он преждевременно убит):
trap cleanup_function 0
0 - это специальный сигнал, означающий "на выходе"