通过 `-c` 参数 Bash 多个命令奇怪的信号行为?

Chr*_*ski 2 shell bash process signals

bash -c "sleep 5; echo 'test'"
Run Code Online (Sandbox Code Playgroud)

如果我运行上面的命令,并CTRL-C在 中按下sleep 5,它将终止整个过程并且echo 'test'不会显示。

我怎样才能运行上面的命令并允许sleep命令处理SIGINT( CTRL-C)?

我猜是SIGINTbash 进程而不是内部命令?

小智 6

bash(和其他 shell)在没有作业控制的情况下运行脚本,因此 ^C 将杀死整个脚本,而不仅仅是sleep(因为它们都是同一前台进程组的一部分)。

您应该在该脚本中使用以下命令打开作业控制set -m

$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$
Run Code Online (Sandbox Code Playgroud)

或者捕获SIGINT脚本中的信号:

$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$
Run Code Online (Sandbox Code Playgroud)

注意:代替''; 如果您忽略SIGINT它的子进程将继承该配置并且也会忽略它。

我猜 SIGINT 将进入 bash 进程而不是内部命令?

它会发送给他们两个——一个VINTR字符(^C默认情况下)将从SIGINT前台作业(进程组)向所有进程发送信号。