问题:
我有一个一直在编写的 shell 程序,但我不知道如何确保它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
陷阱时,$?
包含退出状态。这与您在另一个 shell 中调用此脚本后找到的值相同$?
:传递给的参数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