Это не ответ на поставленный вопрос, а лишь отступление, показывающее, что предпосылка исходного вопроса, что "временный файл ... должен быть удален вручную", совершенно неверна.
(Я опубликовал этот "ответ" в том случае, если заметить, что эта предпосылка ложна, позволит ОП и другим людям не стесняться использовать временные файлы. Во многих случаях использование временных файлов делает скрипты более надежными и более простыми в сопровождении.)
Если скрипту Bash необходимо использовать один или несколько временных файлов, я всегда использую следующий подход:
#!/bin/bash
work="$(mktemp -d)" || exit 1
trap "cd / ; rm -rf '$work'" EXIT
Здесь используется помощник mktemp
для создания временного рабочего каталога (в /tmp/
). Если mktemp
недоступен или каталог не может быть создан, сценарий прерывается.
Чтобы автоматически удалить рабочий каталог и все файлы, которые он может содержать, мы устанавливаем ловушку EXIT
. Эта ловушка срабатывает - то есть bash выполняет указанную команду - всякий раз, когда shell завершает работу; будь то обычный выход или из-за ошибки.
Команда EXIT
trap переходит в корневой каталог (просто чтобы убедиться, что текущий рабочий каталог не находится во временном каталоге), а затем удаляет все поддерево. Обратите внимание, что поскольку команда заключена в двойные кавычки, $work
оценивается при установке ловушки; это означает, что даже если вы измените значение переменной work
позже в сценарии, ловушка все равно удалит исходный временный каталог.
Хотя ловушка изменяет текущий рабочий каталог, это не будет иметь никакого эффекта за пределами ловушки - ни в сценарии в другом месте, ни для других процессов - потому что текущий рабочий каталог специфичен для каждого процесса, а текущий процесс bash завершится сразу после выполнения команды ловушки.
Поэтому любые временные файлы, созданные под $work
, например "$work/1"
, "$work/result"
и так далее, автоматически удаляются, как и сам временный каталог $work
, после завершения работы скрипта.