私は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 }
これは、SIGINTをbash
(スクリプトを実行している)ではなく、フォアグラウンドのプロセスに送信するためです。これを行う場合は、関数を非同期にしてから、wait
を使用します(これは期待どおりに動作し、トラップを使用します)。
Protip:フォアグラウンドプロセスにQUITを送信します Ctrl-\ いつ Ctrl-C、-Z、-D 機能していません。
trap - list of signals here
を使用して、実行の最後にトラップをクリアします
非本番システムでの楽しみ:賢明なすべての信号にトラップを設定してみてください(たとえば、KILLではありません)。 kill -l
(数字の1やパイプではなく小文字のLではありません|)
機能をグローバルにすべきだと思います
#!/bin/bash
trap ctrl_c INT
ctrl_c () {
echo "** Trapped CTRL-C"
}
for i in `seq 1 100`; do
sleep 1
echo -n "."
done