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


13

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

たとえば、source以下のコードを実行してf、今すぐCtrl+を試してみてくださいC

trapbash関数で設定する方法は?

  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 } 

2
あなたは置いてもよいfあなたのコードの末尾に、そしてからスペースを削除しますf ()
GWF

回答:


7

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


それは一種の作品です。しかしf、パイプ内にある場合echo 123 | f、それはトラップされていませんか?
チェン

@Chengサブシェルを使用します(とにかくこの場合のパイプは不要です。単にheredoc / herestringを使用してください)。(command | command) &
クリスダウン

1

Protip:フォアグラウンド・プロセスがでQUIT A送るCtrl- - 、- 、- 動作していません。\CtrlCZD

実行終了時にトラップをクリア trap - list of signals here

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


0

関数をグローバルにする必要があると思います

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

INTSIGINT同義です-それは違いはありません。
クリスダウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.