프로세스가 자체적으로 종료되도록 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함수는 결국 두 번 호출됩니다.

인용한 위키 페이지에서는 이 문제를 처리하는 방법을 설명합니다(bash에서만).

따라서 정리하려면 EXIT를 잡고 거기에서 정리 기능을 호출하면 됩니다. 많은 신호를 포착하지 마십시오.

관련 정보