bash -c "sleep 5; echo 'test'"
如果我运行上面的命令,并CTRL-C
在 中按下sleep 5
,它将终止整个过程并且echo 'test'
不会显示。
我怎样才能运行上面的命令并允许sleep
命令处理SIGINT
( CTRL-C
)?
我猜是SIGINT
bash 进程而不是内部命令?
答案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
前台作业(进程组)向所有进程发送信号。