Ctrl-C 并不总是终止 shell 脚本

Phi*_*ppe 3 bash docker

我有两种情况:

#!/usr/bin/env bash
  
sleep infinity
# When I type Ctrl-C here, "sleep" command and script are stopped so I didn't see "End"

echo End
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/env bash
  
docker exec container-id sleep infinity
# When I type Ctrl-C here, "docker exec" command is stopped but script continued so I saw "End"

echo End
Run Code Online (Sandbox Code Playgroud)

为什么行为上有差异?

ogu*_*ail 5

这就是当 bash 的进程组收到 SIGINT 但当前在前台运行的程序正常终止时的行为方式。

此行为的基本原理如下

基本思想是用户希望键盘生成的 SIGINT 转到前台进程;该流程决定如何处理它;bash 会做出相应的反应。如果进程因 SIGINT 而终止,则 bash 的行为就像收到了 SIGINT 一样;如果没有,bash 假定该进程处理了它并有效地忽略它。

考虑一个进程(emacs 是常见的示例),该进程将 SIGINT 用于其自身目的,作为正常操作的一部分。如果您在脚本中运行该程序,您不希望 shell 意外中止该脚本。