我有一个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
而不是使用脚本?",答案是该脚本包含进一步的半自动硬件调试测试,因此启动脚本并执行所有操作更方便,而无需运行更多命令。
答案 0 :(得分:6)
您可以使用trap
命令“捕获”信号;这是C语言中的signal()
或sigaction()
调用的shell等价物以及大多数其他编程语言来捕获信号。
为子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