为什么控制台中的 ctrl+c 会终止后台进程

为什么控制台中的 ctrl+c 会终止后台进程

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

`./my_script.sh 1` &

该命令立即用代码完成执行130

[1]+  Exit 130              `./my_script.sh 1` &

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

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

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

答案1

当你写命令时

`./my_script.sh 1` &

你正在做命令替换(见下文)。
实际上,你正在执行子壳(用于反引号的``)在后台(&)运行您的脚本(./my_script.sh 1)。

现壳正在等待其子 shell 执行结束,以将其输出作为命令运行
子壳正在等待脚本结束。
你按 Ctrl+C你打断这个等待,将信号传递SIGINT给孩子。

此时,当前 shell 尝试将目前获得的输出作为命令运行……并生成错误,130这意味着“脚本由 Control-C 终止” [2]


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

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

例如

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

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

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

总是当前 shell 正在等待所有子进程的输出。单个Ctrl+C将结束所有等待。

如果您等待脚本结束,当前 shell 将在脚本完成时尝试执行其输出。

相关内容