背景
バッシュ 4.2
envar
ファイルが2つあります。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
殻は母親がなくなります。私は他の強制信号が発生したときに両方のシェルが死ぬことを望んでいます。spinner $pid
ctrl-c
ここでTrapをどのように使用すればよいですか?
答え1
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
}
これによりサブシェルも死にます。私がテストしたものは次のとおりです。
$ 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