[英]Terminate program with Ctrl-C without terminating parent script
我有一个bash脚本,可以两次启动一个外部程序( evtest
)。
#!/bin/bash
echo "Test buttons on keyboard 1"
evtest /dev/input/event1
echo "Test buttons on keyboard 2"
evtest /dev/input/event2
据我所知, evtest
只能通过Ctrl-C终止。 问题在于这也会终止父脚本。 这样,对evtest的第二次调用将永远不会发生。
如何关闭第一个evtest
而不关闭脚本,以便第二个evtest
实际运行?
谢谢!
PS:对于一个想问“为什么不手动运行evtest
而不使用脚本?”的人,答案是该脚本包含进一步的半自动硬件调试测试,因此启动脚本和执行所有操作更加方便无需运行其他命令。
您可以使用trap
命令来“捕获”信号。 这等效于C语言和大多数其他编程语言中的signal()
或sigaction()
调用的外壳程序,以捕获信号。
陷阱将为子shell重置,因此evtest
仍将对^C
发送的SIGINT
信号(通常通过退出)起作用,但父进程(即shell脚本)则不会。
简单的例子:
#!/bin/sh
# Run a command command on signal 2 (SIGINT, which is what ^C sends)
sigint() {
echo "Killed subshell!"
}
trap sigint 2
# Or use the no-op command for no output
#trap : 2
echo "Test buttons on keyboard 1"
sleep 500
echo "Test buttons on keyboard 2"
sleep 500
还有一个变体,它仍然允许您通过每秒两次按下^C
来退出主程序:
last=0
allow_quit() {
[ $(date +%s) -lt $(( $last + 1 )) ] && exit
last=$(date +%s)
}
trap allow_quit 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.