Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用Ctrl-C终止程序而不终止父脚本_Bash - Fatal编程技术网

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

Bash 使用Ctrl-C终止程序而不终止父脚本,bash,Bash,我有一个bash脚本,可以启动一个外部程序(evtest)两次 据我所知,evtest只能通过Ctrl-C终止。问题是这也会终止父脚本。这样,对evtest的第二次调用就永远不会发生 如何在不关闭脚本的情况下关闭第一个evtest,以便第二个evtest将实际运行 谢谢 注意:对于想问“为什么不手动运行evtest而不是使用脚本?”的人,答案是该脚本包含进一步的半自动硬件调试测试,因此,启动脚本和执行任何操作都更加方便,无需运行进一步的命令。您可以使用trap命令来“捕获”信号;这是C和大多数其

我有一个bash脚本,可以启动一个外部程序(
evtest
)两次

据我所知,
evtest
只能通过Ctrl-C终止。问题是这也会终止父脚本。这样,对evtest的第二次调用就永远不会发生

如何在不关闭脚本的情况下关闭第一个
evtest
,以便第二个
evtest
将实际运行

谢谢


注意:对于想问“为什么不手动运行
evtest而不是使用脚本?”的人,答案是该脚本包含进一步的半自动硬件调试测试,因此,启动脚本和执行任何操作都更加方便,无需运行进一步的命令。

您可以使用
trap
命令来“捕获”信号;这是C和大多数其他编程语言中捕捉信号的
signal()
sigaction()
调用的shell等价物

子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
last=0
allow_quit() {
    [ $(date +%s) -lt $(( $last + 1 )) ] && exit
    last=$(date +%s)
}
trap allow_quit 2