Ответ 1
Используйте mktemp -d
. Он создает временный каталог со случайным именем и гарантирует, что файл еще не существует. Вы должны помнить, что нужно удалить каталог после его использования.
Я использую для создания tempfile
, удалять его и воссоздавать его как каталог:
tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"
Проблема в том, что другой процесс может получить одно и то же имя X
, если он случайно выполнит временный файл после одного процесса rm -f X
и непосредственно перед mkdir X
.
Используйте mktemp -d
. Он создает временный каталог со случайным именем и гарантирует, что файл еще не существует. Вы должны помнить, что нужно удалить каталог после его использования.
Для более надежного решения я использую что-то вроде следующего. Таким образом, временный каталог всегда будет удален после выхода script.
Функция очистки выполняется по сигналу EXIT
. Это гарантирует, что функция очистки всегда вызывается, даже если script прерывается где-то.
#!/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 script из here.
Bash ловушки.
Мой любимый однострочный шрифт для этого -
cd $(mktemp -d)
Следующий фрагмент безопасно создаст временный каталог (-d
) и сохранит его имя в TMPDIR
. (Пример использования переменной TMPDIR
показан ниже в коде, где она используется для хранения исходных файлов, которые могут быть изменены.)
Первая строка trap
выполняет команду exit 1
при получении любого из указанных сигналов. Вторая строка trap
удаляет (очищает) $TMPDIR
при выходе из программы (как нормальной, так и ненормальной). Мы инициализируем эти ловушки после того, как проверим, что mkdir -d
удалось избежать случайного выполнения ловушки выхода с $TMPDIR
в неизвестном состоянии.
#!/bin/bash
# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)
# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
>&2 echo "Failed to create temp directory"
exit 1
fi
# Make sure it gets removed even if the script exits abnormally.
trap "exit 1" HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT
# Example use of TMPDIR:
for f in *.csv; do
cp "$f" "$TMPDIR"
# remove duplicate lines but keep order
perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done