Как создать временный каталог?


я использую для создания tempfile, удалите его и воссоздайте в виде каталога:

tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"

проблема в том, что другой процесс может получить то же имя X, если он случайно выполняет tempfile после одного процесса rm -f X и перед mkdir X.

3 181

3 ответа:

использовать mktemp -d. Он создает временный каталог со случайным именем и гарантирует, что файл уже не существует. Вы должны помнить, чтобы удалить каталог после его использования, хотя.

мой любимый однострочный для этого

cd $(mktemp -d)

для более надежного решения я использую что-то вроде следующего. Таким образом, temp dir всегда будет удален после выхода скрипта.

функция очистки выполняется на EXIT сигнал. Это гарантирует, что функция очистки всегда вызывается, даже если сценарий прерывается где-то.

#!/bin/bash    

# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`

# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
  echo "Could not create temp dir"
  exit 1
fi

# deletes the temp directory
function cleanup {      
  rm -rf "$WORK_DIR"
  echo "Deleted temp working directory $WORK_DIR"
}

# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT

# implementation of script starts here
...

каталог скрипта bash от здесь.

Баш ловушки.