질문:
trap
제가 작성한 쉘 프로그램이 있지만 정리를 위해 마지막에 포착되는지 또는 일부 명령의 버그로 인해 어떤 방식으로든 정리되는지 확인하는 방법을 모르겠습니다 .
코드는 다음과 같습니다.
################################### Successful exit then this cleanup ###########################################################3
successfulExit()
{
IFS=$IFS_OLD
cd "$HOME" || { echo "cd $HOME failed"; exit 155; }
rm -rf /tmp/svaka || { echo "Failed to remove the install directory!!!!!!!!"; exit 155; }
}
###############################################################################################################################33
####### Catch the program on successful exit and cleanup
trap successfulExit EXIT
질문:
절차가 완료된 후에 trap
만 어떻게 할 수 있나요 ?trap EXIT
전체 스크립트는 다음과 같습니다.
답변1
EXIT
트랩에 진입할 때 $?
종료 상태를 포함합니다. 이는 다른 셸에서 이 스크립트를 호출한 경우 찾을 수 있는 것과 동일한 값입니다 $?
. 즉, 전달된 인수 exit
(0-255 범위로 잘림) 또는 이전 명령의 반환 상태입니다. 종료의 경우 set -e
명령의 반환 상태가 암시적으로 트리거됩니다 exit
.
$?
일반적 으로 동일한 상태로 저장하고 다시 종료해야 합니다 .
cleanup () {
if [ -n "$1" ]; then
echo "Aborted by $1"
elif [ $status -ne 0 ]; then
echo "Failure (status $status)"
else
echo "Success"
fi
}
trap 'status=$?; cleanup; exit $status' EXIT
trap 'trap - HUP; cleanup SIGHUP; kill -HUP $$' HUP
trap 'trap - INT; cleanup SIGINT; kill -INT $$' INT
trap 'trap - TERM; cleanup SIGTERM; kill -TERM $$' TERM
답변2
허용된 답변에 문제가 있으면 cleanup
결국 여러 번 호출될 수 있습니다. 트랩 제거를 정리 기능으로 이동하여 해결되었습니다.
cleanup () {
local exit_status=$?
local exit_signal="$1"
if [ -n "$exit_signal" ]; then
echo "Aborted by $1"
elif [ $exit_status -ne 0 ]; then
echo "Failure (status $exit_status)"
else
echo "Success"
fi
trap - EXIT HUP INT TERM
return $exit_status
}
trap cleanup EXIT
trap 'cleanup SIGHUP; kill -HUP $$' HUP
trap 'cleanup SIGINT; kill -INT $$' INT
trap 'cleanup SIGTERM; kill -TERM $$' TERM