Menu

從菜單中呼叫的退出腳本而不退出菜單

  • August 26, 2021

我編寫了這個菜單,它呼叫了幾個腳本。這個腳本之一是

dbus-monitor --system

因此它通過 dbus 顯示實時流量。

但是當我想退出時,我通常會這樣做Ctrl+ C,但這也會退出我的菜單,我只想返回我的菜單。

有沒有我可以在 dbus-moniter 之後放置的程式碼,當檢測到退出時,它會再次啟動我的菜單?我的菜單只是另一個 .sh 腳本

或者 ….

                • 闡明 - - - - - - - -

我在腳本編寫方面“還沒有”那麼先進;)。這是我呼叫 dbus 腳本的菜單

select opt in "dbus Live Traffic" "option 2" "Main menu" "Quit"
   do
       case $opt in
           "dbus Live Traffic")
               curl -s -u lalala:hihihi ftp://ftp.somewhere.com/folder/dbuslivetraffic.sh | bash ;;   
           "option 2")
               do_something ;;   
           "Main menu")
               main_menu;;
           "Quit")
               quit_menu;;
       esac
       if [[ $opt != "Main menu" ]] || [[ $opt != "Quit" ]] ;
       then
           main_menu
       fi
   done

這是我的 dbuslivetraffic.sh 的內容

dbus-monitor --system

現在只有這一行,但也許在不久的將來會有更多的程式碼被添加到這個腳本中。

我真的不明白我需要把TRAP@RoVo建議的函式放在哪裡

您可以在子shell 中執行該命令,並trapSIGINT執行kill 0時僅終止子shell 的程序組。

select opt in a b; do
   case $REPLY in
     1)
       (
         trap "kill -SIGINT 0" SIGINT
         sleep 10
       )
       ;;
     2)
       sleep 10
       ;;
   esac
done
  • 選擇 (1) 將讓您使用Ctrl+c而不會終止菜單。
  • 選擇 (2) 並按Ctrl+c也會終止菜單。

圖形桌面環境

您可以在另一個終端視窗中執行該命令(如果您有圖形桌面環境)。

以下 shellscript 使用xterm,可以安裝

sudo apt update
sudo apt install xterm

但您也可以使用其他終端視窗模擬器,例如gnome-terminallxterminal.

腳本:

#!/bin/bash

select opt in "dbus-monitor --system" htop exit; do
   case $REPLY in
     1)
       xterm -e dbus-monitor --system 2>/dev/null
       ;;
     2)
       htop
       ;;
     3)
       exit
       ;;
   esac
done

文本螢幕(此方法也適用於圖形桌面)

您可以在@RoVo 的答案中使用陷阱方法。

重要的是在執行trap命令之前執行命令,你必須用ctrl+中斷c

  • 因此,如果您想在整個菜單腳本中使用它,請將其放在開頭。
  • 如果您僅在絕對必要時才需要它,請執行子shell並將trap命令放入子shell中,如@RoVo所示,或者使用
bash -c 'trap "kill -SIGINT 0" SIGINT; dbus-monitor --system';;

腳本:

#!/bin/bash

echo "Press the Enter key to print out the menu again"

trap "kill -SIGINT 0" SIGINT

select opt in "dbus-monitor --system" "option 2" "Quit"
do
   case $opt in
       "dbus-monitor --system")
           dbus-monitor --system;;   
       "option 2")
           echo "Hello World";;   
       "Quit")
           exit;;
   esac
done

評論

您的curl命令行對我不起作用,因此我呼叫本地dbus-monitor來測試使用ctrl+時 shellscript 是否有效c

引用自:https://unix.stackexchange.com/questions/490277