Trap
陷阱“ctrl-c”殺死後台shell
背景
重擊 4.2
我有兩個文件
envar
和main.sh
恩瓦爾
... # displays a spinner so that user knows the job is under processing. spinner() { spin='-\|/' i=0 while kill -0 $1 2>/dev/null do i=$(( (i+1) %4 )) printf "\e[1;33m" printf "\r${spin:$i:1}" printf "\e[m" sleep .1 done } ...
main.sh
source envar very_slow_and_dangerous_function & pid=$! spinner $pid echo "$jobs done"
問題
當有人在後台按下
ctrl-c
時spinner $pid
外殼變得無母。我希望在
ctrl-c
發生或任何其他力信號發生時殺死兩個砲彈。我如何在這裡使用陷阱?
您可以
SIGINT
嘗試kill 0
陷入envar
:$ cat envar trap "kill 0" SIGINT spinner() { spin='-\|/' i=0 while kill -0 $1 2>/dev/null do i=$(( (i+1) %4 )) printf "\e[1;33m" printf "\r${spin:$i:1}" printf "\e[m" sleep .1 done }
這將使 subshell 也死掉。我測試過:
$ cat foo.sh #!/bin/bash ## source your function file . envar sleep 600 & pid=$! spinner $pid echo "$jobs done"
執行它並用
Ctrl
+殺死C
會導致:$ foo.sh /^CTerminated $ pgrep -c sleep 0