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前台作业(进程组)向所有进程发送信号。