39

bashでSIGINTを傍受し、何かをしてから無視することは可能ですか(bashを実行し続けます)。

SIGINT を無視できることを知っています

trap '' SIGINT

そして、私は署名で何かをすることもできます

trap handler SIGINT

ただし、handler実行後もスクリプトは停止します。例えば

#!/bin/bash

handler()
{
    kill -s SIGINT $PID
}

program &
PID=$!

trap handler SIGINT

wait $PID

#do some other cleanup with results from program

ctrl+c を押すと、プログラムへの SIGINT が送信されますが、bash は、waitプログラムが適切にシャットダウンされ、シグナル ハンドラーで出力が作成される前にスキップします。

@suspectus answer を使用して、次のように変更できますwait $PID

while kill -0 $PID > /dev/null 2>&1
do
    wait $PID
done

これは実際に機能しますが、これが「クリーン」なのか「ダーティな回避策」なのか、100%確信が持てません。

4

2 に答える 2

19

トラップはハンドラーから戻りますが、ハンドラーが呼び出されたときにコマンドが呼び出された後です。

したがって、解決策は少し不器用ですが、必要なことはできると思います。trap handler INTも動作します。

trap 'echo "Be patient"' INT

for ((n=20; n; n--))
do
    sleep 1
done
于 2013-04-03T11:51:58.740 に答える