这是我的剧本;
#!/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”选项运行的命令。