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

通过 `-c` 参数 Bash 多个命令奇怪的信号行为?
bash -c "sleep 5; echo 'test'"

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

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

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

答案1

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

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

$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$

或者抓住SIGINT脚本中的信号:

$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$

注意:代替'';如果你忽略,其子进程SIGINT将继承该配置并忽略它。

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

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

相关内容