簡體   English   中英

在bourne shell腳本結束時刪除臨時文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM