为什么控制台中的ctrl+c会杀死后台进程

Joh*_*est 5 linux bash shell

您能否解释一下为什么我的 shell 中的Ctrl+会影响之前在后台运行的命令:Cbash

`./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)

该命令立即完成执行,130代码如下:

[1]+  Exit 130              `./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)

Ctrl+的通常行为C是杀死前台进程。这里发生了什么?

编辑1:(我的想法)也许与反引号有关 - 这里子子shell进程启动并且当父进程收到它时它以某种方式接收Ctrl+C

编辑2:我发现Ctrl+C使用反引号停止从当前 shell 运行的所有后台进程。

Has*_*tur 1

当你写下命令时

`./my_script.sh 1` &
Run Code Online (Sandbox Code Playgroud)

您正在执行命令替换(见下文)。实际上,您正在后台 ( ) 中
执行一个子 shell(反引号的子 shell ) ,并在其中运行您的脚本 ( )。 ``&./my_script.sh 1

当前shell正在等待其子 shell 执行结束,以将其输出作为命令运行。
shell正在等待脚本结束。
您按下 Ctrl+时C,您会中断此等待,并将信号传递SIGINT给孩子。

此时,当前 shell 尝试作为迄今为止获得的输出的命令运行...并且它会生成错误130,表示“脚本被 Control-C 终止” [ 2 ]


在 bash 中,使用反引号``以及使用$(),您可以进行命令替换 [ 1 ]

Bash 通过执行 COMMAND 并将命令替换替换为命令的标准输出来执行扩展,并删除所有尾随换行符。

例如

echo `date`   
Thu Feb 6 10:06:20 CET 2003 
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在后台运行更多此类命令

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &
Run Code Online (Sandbox Code Playgroud)

当前 shell 始终在等待所有子级的输出。一个Ctrl+C将结束所有人的等待。

相反,如果您等待脚本结束,则当前 shell 将尝试执行其输出,因为它们将完成。