为 bash 脚本捕获“Ctrl + c”,但不为在此脚本中打开的进程捕获“Ctrl + c”

为 bash 脚本捕获“Ctrl + c”,但不为在此脚本中打开的进程捕获“Ctrl + c”

我尝试在 bash 脚本中创建一个交互式程序:

my_program

我希望能够用“Ctrl + c”关闭它。但当我这样做时,我的脚本也会关闭。

我知道。

trap '' 2
my_program
trap 2

但在这种情况下,我无法my_program用 Ctrl + c 关闭。

您是否知道如何在程序上允许 Ctrl + c,但不关闭运行它的脚本?

编辑:添加示例

#!/bin/bash
my_program
my_program2

如果我使用 Ctrl + c 关闭my_programmy_program2则永远不会执行,因为整个脚本已退出。

答案1

您应该使用trap true 2ortrap : 2代替trap '' 2.这就是 bash shell 中的“help trap”所说的:

如果 ARG 为空字符串,则 shell 会忽略每个 SIGNAL_SPEC并通过它调用的命令

例子:

$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
   <press control-C>
^Cfirst cat killed
   <press control-C>
^Csecond cat killed
done

答案2

-您可以通过将 trap 命令作为其操作参数将陷阱重置为其默认值。如果您在子外壳,它不会影响父 shell 中的陷阱。在脚本中,您可以对需要使用 Ctrl-C 中断的每个命令执行此操作:

#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.

答案3


当您使用Crtl+时C,您打断该程序 (”“它)。
您可能正在寻找的是暂停你的程序(“暂停" it)。为此,您可以使用Crtl+ Z
一旦您的程序暂停,您可以使用 来查看它jobs。例如:
[1]+ Stopped ./foobar
这里我只有一项工作,工作#1,但可以有多个工作 - 每个工作都有其
您可以使用许多命令来控制挂起的进程,例如和bg将重新启动作业#1 。fgkill
bg %1b确认G回合
fg %1将重新启动作业#1F矿石Ground
kill %1将终止 job #1请注意,如果您只有一项活动作业,
则可以使用bgand且不带任何参数。fg

相关内容