ターミナルセッションを閉じると、bash "select"メニュースクリプトは無限ループに入ります。

ターミナルセッションを閉じると、bash

私が使用する単純な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

ベストアンサー1

おすすめ記事