그래서 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
함수는 결국 두 번 호출됩니다.
인용한 위키 페이지에서는 이 문제를 처리하는 방법을 설명합니다(bash에서만).
따라서 정리하려면 EXIT를 잡고 거기에서 정리 기능을 호출하면 됩니다. 많은 신호를 포착하지 마십시오.