从菜单中调用退出脚本而不退出菜单

从菜单中调用退出脚本而不退出菜单

我编写了这个需要几个脚本的菜单。该脚本之一是

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建议的那样

答案1

您可以在子 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也会终止菜单。

答案2

图形桌面环境

您可以在另一个终端窗口中运行该命令(如果您有图形桌面环境)。

以下 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's 答案中的 trap 方法。

重要的是运行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来测试 shellscript 在使用ctrl+时是否有效c

答案3

添加到 @pLumo 的很好的答案,您可以定义这样的函数,以缩短每个 所需的代码量case

run_in_subshell () {
    command="$@"
    (
        trap "kill -INT 0" INT
        $command
    )
}

然后在case

select opt in a b; do
    case $REPLY in
      1) run_in_subshell sleep 10 ;;
      2) sleep 10 ;;
    esac
done

相关内容