[英]Remove temporary files at end of bourne shell script
我試圖在Bourne shell腳本的末尾使用trap
來刪除臨時文件,但是這不起作用:
trap "trap \"rm \\\"$out\\\"\" EXIT INT TERM" 0
順便說一句,這是在函數內部,因此嘗試嵌套陷阱。
我該怎么做?
每個信號只能設置一個陷阱。 如果腳本的不同部分需要執行不同的清理操作,則必須創建清理操作列表。 然后設置一個執行所有必需清理操作的陷阱處理程序。
這是一個例子:
set -xv
PROG="$(basename -- "${0}")"
# set up your trap handler
TEMP_FILES=()
trap_handler() {
for F in "${TEMP_FILES[@]}"; do
rm -f "${F}"
done
}
trap trap_handler 0 1 2 3 15
something_that_uses_temp_files() {
mytemp="$(mktemp -t "${PROG}")"
TEMP_FILES+=("${mytemp}")
date > "${mytemp}"
# ...
}
# ...
something_that_uses_temp_files
# ...
有一個陷阱處理程序,但您可以通過附加到TEMP_FILES
數組從腳本中的任何位置注冊清理操作。 清理操作也可以從內部函數注冊。
如果你沒有使用帶有數組的shell,基本思路是一樣的,但實現細節會有所不同。 例如,您可以將列表存儲為冒號分隔的字符串變量,使用每個POSIX shell中的${parameter%%word}
擴展來迭代陷阱處理程序中的元素:
#!/bin/sh
set -xv
PROG="$(basename -- "${0}")"
# set up your trap handler
TEMP_FILES=""
trap_handler() {
while [ -n "${TEMP_FILES}" ]; do
CUR_FILE="${TEMP_FILES%%:*}"
TEMP_FILES="${TEMP_FILES#*:}"
if [ "${CUR_FILE}" = "${TEMP_FILES}" ]; then
# there were no colons -- CUR_FILE is the last file to process
TEMP_FILES=""
fi
if [ -n "${CUR_FILE}" ]; then
rm -f "${CUR_FILE}"
fi
done }
trap trap_handler 0 1 2 3 15
something_that_uses_temp_files() {
mytemp="$(mktemp -t "${PROG}")"
TEMP_FILES="${TEMP_FILES}:${mytemp}"
date > "${mytemp}"
# ... }
# ...
something_that_uses_temp_files
something_that_uses_temp_files
# ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.