bash
( и другая оболочка )запускают сценарии без управления заданиями, поэтому ^C уничтожит весь сценарий, а не только sleep
(, потому что они оба являются частью одной и той же группы процессов переднего плана ).
Вы должны включить управление заданиями в этом скрипте с помощьюset -m
:
$ bash -c 'set -m; sleep 5; echo test'
^Ctest
$
Или поймать сигнал SIGINT
в скрипте:
$ bash -c 'trap : SIGINT; sleep 5; echo test'
^Ctest
$
Обратите внимание на :
вместо ''
; если вместо этого вы проигнорируете SIGINT
, его дочерние процессы унаследуют это расположение и тоже будут его игнорировать.
I'm guessing the the SIGINT is going to the bash process instead of the inner command?
Это будет для них обоих --символ VINTR
(^C
по умолчанию )отправит сигнал SIGINT
всем процессам из группы процессов переднего плана ().