Я хочу знать, есть ли какое-то решение, чтобы убить некоторый стек функций, не выходя из скрипта. У меня есть меню, подменю и функция захвата ловушки. Я положу «уменьшенный» пример и попытаться объяснить мою проблему после того, что:Bash. убивающий стек функций выборочно
#!/bin/bash
function main_menu() {
current_menu="main_menu"
echo "this is main menu. Choose 1 to go to submenu1 or 2 to exit"
read mainopt
case ${mainopt} in
1)
submenu1
;;
2)
exit
;;
*)
invalid_opt
;;
esac
main_menu
}
function submenu1() {
current_menu="submenu1"
echo "this is submenu1. Choose 1 to operate or 2 to return to main menu"
read submenu1opt
case ${submenu1opt} in
1)
read -p "script operate"
;;
2)
return
;;
*)
invalid_opt
;;
esac
submenu1
}
function invalid_opt() {
read -p "invalid option chosen. press Enter key to continue"
}
function capture_traps() {
echo
echo "you can't exit with Ctrl+c"
launch_current_menu
}
function launch_current_menu() {
case ${current_menu} in
"submenu1")
submenu1
;;
*)
main_menu
;;
esac
}
trap capture_traps INT
main_menu
Ok, чтобы воспроизвести проблему:
-В главном меню, нажмите 1, чтобы перейти в подменю
-Для submenu1 , Нажмите Ctrl + c
-После сообщения «вы не можете выйти с Ctrl + c», снова в подменю1 нажмите 2, чтобы перейти в главное меню. Он не возвращается.
Проблема в том, что она не возвращается, поскольку в ней есть другое подменю в стеке. Вы должны снова нажать «2», чтобы вернуться в главное меню. Как избежать проблемы? Желаемое поведение (не уверенное, если возможно) убивает весь стек функций в функции capture_traps, кроме последней. Можно это сделать? Спасибо.
«Боковое примечание» стоит нескольких оборотов, но я могу дать только один. – rici
Это не то, о чем я прошу. Во всяком случае, может быть, ваш пример может быть идеей реструктурировать сценарий. Пример, который я поставил - это сокращенная версия, намного сложнее. Я обнаружил $ {FUNCNAME [@]}, чтобы увидеть стек функций ... не уверен (еще не пробовал), если я могу закончить функцию из другой функции, это может быть приятно. Благодарю. – OscarAkaElvis