背景
bash 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
}
...
主目录
source envar
very_slow_and_dangerous_function &
pid=$!
spinner $pid
echo "$jobs done"
问题
当有人在后台按下ctrl-c
时,shell 就会变得失去母亲。我希望当或任何其他力信号发生 时,两枚炮弹都会被杀死。spinner $pid
ctrl-c
这里我该如何使用Trap?
答案1
您可以尝试捕获SIGINT
in 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
}
这会让子shell也死掉。我测试过:
$ 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