我有一个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()
orsigaction()
调用的外壳程序,以捕获信号。
陷阱被重置为子shell,因此,evtest
仍然会对(通常是通过退出)SIGINT
发送的信号^C
起作用,但是父进程(例如,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句