我编写了这个需要几个脚本的菜单。该脚本之一是
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 中运行该命令,并trap
在SIGINT
运行时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-terminal
或lxterminal
。
外壳脚本:
#!/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