2016-05-08 7 views
1

Я хочу знать, есть ли какое-то решение, чтобы убить некоторый стек функций, не выходя из скрипта. У меня есть меню, подменю и функция захвата ловушки. Я положу «уменьшенный» пример и попытаться объяснить мою проблему после того, что: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, кроме последней. Можно это сделать? Спасибо.

ответ

1

Если я правильно понимаю, что вы ищете что-то вроде этого:

#!/usr/bin/env bash 

main_menu() { 
    echo "Main menu" 

    trap INT 

    while true 
    do 
     read input 
     submenu 
    done 
} 

submenu() { 
    echo "Submenu" 
    trap main_menu INT 

    while true 
    do 
     read input 
     echo "$input" 
    done 
} 

main_menu 

Это обрабатывает Ctrl - с по-разному в зависимости от контекста:

  • В в главном меню он выходит из сценария
  • В подменю он возвращается в главное меню

Side Примечание: Пожалуйста, учтите, что создание интерактивного меню в сценариях оболочки является образцом только когда-либо видел в нереальных упражнениях и вводящей в заблуждении попытки сделать сценарии более привлекательными для пользователей, не знакомые с * NIX оболочками. Если это будет производственный код, вы будете делать себя и своих пользователей плохими, если будете следовать этому шаблону. Чтение на Bash input and output - это очень хорошее место для начала.

+0

«Боковое примечание» стоит нескольких оборотов, но я могу дать только один. – rici

+0

Это не то, о чем я прошу. Во всяком случае, может быть, ваш пример может быть идеей реструктурировать сценарий. Пример, который я поставил - это сокращенная версия, намного сложнее. Я обнаружил $ {FUNCNAME [@]}, чтобы увидеть стек функций ... не уверен (еще не пробовал), если я могу закончить функцию из другой функции, это может быть приятно. Благодарю. – OscarAkaElvis