トラップ「ctrl-c」はバックグラウンドシェルを殺す

トラップ「ctrl-c」はバックグラウンドシェルを殺す

背景

バッシュ 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 0envar

$ 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

おすすめ記事