如何在不关闭xterm的情况下捕获SIGINT?

Mar*_*ata 5 bash signals

这是我的剧本;

#!/bin/bash
trap '' SIGINT
xterm  &
wait
Run Code Online (Sandbox Code Playgroud)

我运行它并弹出一个xterm.然后我将键盘对准原始终端窗口并点击^C.我不想发生任何事情,但相反,孩子xterm消失了.

(理想情况下,我想安装自己的陷阱处理程序,但这是一个小步骤)

使用disown后分叉xterm从父分离xterm然后^C不对xterm做任何事情,但后来wait不起作用.

我只是想阻止SIGINT进入xterm.

小智 2

当您向 bash 脚本发送 SIGINT 时,信号会传播到脚本中的当前进程,然后执行陷阱中的命令。于是“等待”就被打断了。您必须再次执行“等待”运行。

此外,您还必须确保所有作业都在其自己的进程组 ( set -m) 中启动。从设置手册页:

设置-m

监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,此选项默认处于启用状态(请参阅上面的作业控制)。后台进程在单独的进程组中运行,并在完成时打印包含其退出状态的行。

#!/bin/bash
set -m
trap 'R=true' SIGINT
xterm &
while : ; do
    R=false
    wait
   [[ $R == true ]] || break
done
Run Code Online (Sandbox Code Playgroud)

您可以在 shebang 中看到它使用“-x”选项运行的命令。