Bash

通過-c參數攻擊多個命令奇怪的信號行為?

  • March 23, 2019
bash -c "sleep 5; echo 'test'"

如果我執行上述程序,並在 中按CTRL-Cwhile sleep 5,它將終止整個過程並且echo 'test'不會顯示。

我怎樣才能執行上述命令並允許sleep命令處理SIGINTCTRL-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前台作業(程序組)向所有程序發送一個信號。

引用自:https://unix.stackexchange.com/questions/508212