Я хочу выполнить некоторые команды в конце сценария bash, даже если пользователь нажал CTRL + C, чтобы отменить его выполнение.
Я знаю, что могу запустить скрипт bash из другого языка программирования (например, Python), чтобы я мог использовать блок finally (try-finally) для выполнения некоторого кода.
Но, зная, что StackOverflow является центром обмена невероятными идеями, я спрашиваю, есть ли способ сделать то, что я хочу, из моего скрипта bash.
Итак, идеи?
EDIT:
Мне нужно уничтожить все процессы, открытые в моем bash, то есть процессы Selenium и Xvfb.
Я пытался записать это в код:
trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" EXIT
Но это обязывает меня многократно нажимать "CTRL + C" при каждом запуске подпроцесса из моего скрипта, что-то вроде:
Testing nsi.bd.helpcenter ...^C: -- Total time: 0min 0seg
Testing nsi.bibliography ...^C: -- Total time: 0min 0seg
Testing nsi.digitallibrary ...^C: -- Total time: 0min 0seg
Testing nsi.digitallibraryinstaller ...^C: -- Total time: 0min 1seg
Testing nsi.digitallibraryskins ...^C: -- Total time: 0min 0seg
....#continues
Изменение финала строки ловушки с EXIT на SIGINT, например так:
trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" SIGINT
Делает то же самое.
Что теперь выходить по первому CTRL + C?
Потому что я пытался добавить «выход 1» в финал строки, например
trap "... ;exit 1"
Он работал, чтобы выйти на первом CTRL + C, но не убивал процессы, которые я хотел.
Идеи