Bash通過
通過-c
參數攻擊多個命令奇怪的信號行為?
bash -c "sleep 5; echo 'test'"
如果我執行上述程序,並在 中按
CTRL-C
whilesleep 5
,它將終止整個過程並且echo 'test'
不會顯示。我怎樣才能執行上述命令並允許
sleep
命令處理SIGINT
(CTRL-C
)?我猜
SIGINT
是 bash 程序而不是內部命令?
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
前台作業(程序組)向所有程序發送一個信號。