web-dev-qa-db-ja.com

bash関数でトラップを設定する方法は?

私はbashスクリプトでtrapをセットアップできますが、bash関数はセットアップできません。

たとえば、以下のコードをsource実行してfを実行します。 Ctrl+C、閉じ込められていません!

Bash関数でtrapを設定する方法は?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 
13
Cheng

これは、SIGINTをbash(スクリプトを実行している)ではなく、フォアグラウンドのプロセスに送信するためです。これを行う場合は、関数を非同期にしてから、waitを使用します(これは期待どおりに動作し、トラップを使用します)。

7
Chris Down

Protip:フォアグラウンドプロセスにQUITを送信します Ctrl-\ いつ Ctrl-C、-Z、-D 機能していません。

trap - list of signals hereを使用して、実行の最後にトラップをクリアします

非本番システムでの楽しみ:賢明なすべての信号にトラップを設定してみてください(たとえば、KILLではありません)。 kill -l(数字の1やパイプではなく小文字のLではありません|)

1
Barry A.

機能をグローバルにすべきだと思います

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done
0
harish.venkat