내 스크립트는 다음과 같습니다
trap "$(pwd)/dd-destroy.sh $l-env;$(pwd)/dd-drop.sh $l-db;exit" INT QUIT TERM EXIT
./dd-all.sh $l $l-db $l-env || exit 1
app_ip=$(./dd-status.sh ip $l-env|grep docker-app|awk '{print $3}')
url=http://$app_ip:8080/app/
wget -O /dev/null $url || (echo "access $url failed" && false) || exit 1
이제 "exit 1"(여기서 변경할 수 있음) 오류가 발생하면 이 트랩을 시작하고 싶습니다. 그러나 아무 일도 일어나지 않으면 dd-all.sh는 잘 작동하고 wget은 잘 작동합니다. 나는 파괴를 요구하고 싶지 않습니다.
이 작업을 수행하기 위해 트랩을 사용할 수 있습니까? 이것은 내 스크립트가 아니므로 약간 변경해야 합니다. 여기서 트랩이 잘못된 선택이 아닐까요?
답변1
시작 부분을 변경하여 trap
마지막 명령의 반환 코드(종료에 대한 반환 코드 또는 스크립트 끝의 명령)가 0인지 확인하세요. 즉
trap '[ $? = 0 ] && exit;'"..."
현재 문자열은 어디에 "..."
있습니까? 그 뒤에 공백이 없어야 합니다. 함정에서 빠져나오면 다시 함정에 빠지는 것을 방지할 수 있습니다.
트랩이 SIGINT(control-C)와 같은 신호도 처리하는 경우 트랩은 SIGINT에 대해 한 번 호출된 다음 종료하기 위해 다시 호출됩니다. 트랩이 SIGINT에서 호출되는지 확인할 수 있습니다. $?
128+n이 됩니다. 여기서 n은 신호이므로 SIGINT는 130입니다. $?
다른 명령을 실행하면 변경 사항이 발생하므로 해당 명령으로 시작한 다음 테스트에 사용할 수 있습니다 rc=$?;
.$rc