使用Ctrl-C终止程序而不终止父脚本

时间:2016-03-25 13:19:19

标签: bash

我有一个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而不是使用脚本?",答案是该脚本包含进一步的半自动硬件调试测试,因此启动脚本并执行所有操作更方便,而无需运行更多命令。

1 个答案:

答案 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