プロセス自体が終了するようにSIGINTをキャプチャします。

プロセス自体が終了するようにSIGINTをキャプチャします。

それで5節が出ます。ここそれは私にとって意味があり、それを実装したいと思います。このbashスクリプトがあります

#!/usr/bin/env bash

cp aux.sh aux.sh.bak

cleanup() {
    cp aux.sh.bak aux.sh
    rm -rf aux.sh.bak
}

trap 'cleanup; trap - SIGINT; kill -s SIGINT "$$"' SIGINT
trap cleanup EXIT

echo "Hold this for now" >> aux.sh

read -rp "Hit Enter to finish"

exit 0

Ctrlただし、実行中に+を押すと、C次のエラーが発生します。

Hit Enter to finish^Ccp: cannot stat 'aux.sh.bak': No such file or directory

なぜこのようなエラーが発生するのかわかりません。しかし、私の考えでは、cleanupコマンドの結果が再び実行されるようですkill

私は何が間違っていましたか?これを正しく行う方法は?

ベストアンサー1

Bash では、EXIT終了理由に関係なくトラップが呼び出されます。あなたの場合、トラップをCtrlC実行しSIGINTた後にスクリプトが自分で終了すると、EXITトラップが実行されます。

疑いがあるように、cleanup関数は最終的に2回呼び出されます。

引用した Wiki ページでは、この問題を処理する方法について説明します (bash のみ)。

したがって、クリーンアップするにはEXITをつかみ、そこからクリーンアップ機能を呼び出すだけです。多くの信号をキャプチャしないでください。

おすすめ記事