터미널 세션을 닫으면 bash "select" 메뉴 스크립트가 무한 루프에 빠집니다.

터미널 세션을 닫으면 bash "select" 메뉴 스크립트가 무한 루프에 빠집니다.

작동하는 간단한 bash 메뉴 스크립트가 있습니다.거의완벽한. 그러나 어떤 이유로 "종료" 옵션을 사용하거나 CTRL+C를 사용하여 스크립트를 종료하지 않으면전에터미널 창을 닫으면 스크립트가 무한 루프에 빠지고 CPU 사용량이 4%에서 50%로 올라갑니다! 그런 다음 "kill -9 bash"를 사용하여 스크립트를 종료하여 CPU 사용량을 다시 낮추어야 합니다. 그러나 "Exit" 또는 "CTRL+C"를 사용하여 스크립트를 종료하면 제대로 작동합니다.

물론 완벽한 세상에서는 항상 터미널 세션을 닫기 전에 먼저 종료하겠지만, 이것을 작업 흐름에 넣으면 스크립트를 먼저 종료하지 않고 잊어버리고 터미널 세션을 닫는 때가 올 것입니다. 그런 다음 백그라운드에서 CPU 사용량이 증가하게 됩니다.

나는 이것이 "while true; do"를 사용하는 것과 관련이 있다는 것을 알고 있습니다. 왜냐하면 사용하기 전에는 이 문제가 없었기 때문입니다. 하지만 "true일 때; do"가 필요합니다. 그렇지 않으면 주 메뉴로 돌아갈 때 하위 메뉴가 주 메뉴 옵션을 표시하지 않습니다. 그래서 그것은 구현되어야했습니다.

어떤 아이디어가 있나요?

#!/bin/bash

main_menu () {
while true; do
  clear
  PS3='Select an option: '
  options=("Option1" "Option2" "SubMenu" "Exit")

  select opt in "${options[@]}";
  do
      case $opt in
          "Option1")
              echo ""
              echo Option1
              read -p ""
              clear
              break
           ;;
          "Option2")
              echo ""
              echo Option2
              read -p ""
              clear
              break
           ;;
          "SubMenu")
              while true; do
              clear
              PS3='Select an option: '
              options=("SubMenu Option1" "SubMenu Option2" "Main Menu")
              select opt in "${options[@]}"
              do
                case $opt in
                    "SubMenu Option1")
                        echo ""
                        echo "Sub-Menu Option1"
                        read -p ""
                        clear
                        break
                        ;;
                    "SubMenu Option2")
                        echo ""
                        echo "Sub-Menu Option2"
                        read -p ""
                        clear
                        break
                        ;;
                    "Main Menu")
                        break 3
                        ;;
                    *) echo "invalid option"
                       ;;
              esac
            done
          done
        ;;
          "Exit")
              exit
           ;;
          *) echo "invalid option"

           ;;
      esac
  done
done
}

main_menu

관련 정보