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

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

내가 사용하는 간단한 bash 메뉴 스크립트가 있습니다거의완벽한. 그러나 어떤 이유로 "종료" 옵션을 사용하지 않거나 CTRL+C를 사용하여 스크립트를 종료하면앞으로터미널 창을 닫으면 스크립트가 무한 루프에 빠지고 CPU 사용량이 4%에서 50%로 늘어납니다! 그런 다음 CPU 사용량을 다시 낮추려면 "kill -9 bash"를 사용하여 스크립트를 종료해야 합니다. 그러나 "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

관련 정보