それで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をつかみ、そこからクリーンアップ機能を呼び出すだけです。多くの信号をキャプチャしないでください。