ターミナルセッションを閉じると、bash の「選択」メニュースクリプトが無限ループに陥る

ターミナルセッションを閉じると、bash の「選択」メニュースクリプトが無限ループに陥る

動作するシンプルなbashメニュースクリプトがありますほとんど完璧です。しかし、何らかの理由で、「終了」オプションまたはCTRL+Cを使用してスクリプトを終了しないと、前にターミナル ウィンドウを閉じると、スクリプトが無限ループに入り、CPU 使用率が 4% から 50% に上昇します。その後、CPU 使用率を再び下げるには、「kill -9 bash」を使用してスクリプトを強制終了する必要があります。ただし、「Exit」または「CTRL+C」を使用してスクリプトを終了すると、問題なく動作します。

もちろん、理想的な世界では、ターミナル セッションを閉じる前に必ず Exit を実行しますが、これをワークフローに組み込むと、スクリプトを Exit せずにターミナル セッションを閉じることを忘れてしまうことが必ず起こります。そうすると、バックグラウンドで CPU 使用率が上昇することになります。

これは「while true; do」の使用と関係があることはわかっています。なぜなら、これを使い始める前は、この問題は発生していなかったからです。しかし、「while 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

関連情報