Что случилось с переменной окружения TMP?
Вопрос
Я всегда слышал, что правильный способ найти временную папку на компьютере UNIX - это посмотреть на переменную окружения TMP.При написании кода, который работал как в Windows, так и в Linux, я бы проверял наличие TEMP и TMP.
Сегодня я обнаружил, что в моей установке Ubuntu вообще нет этой переменной окружения.
Я знаю, кажется, что вы всегда можете рассчитывать на наличие /tmp для размещения ваших временных файлов, но я понял, что TMP - это способ, которым пользователь может сказать вам поместить временные файлы в другое место.
Это все еще так?
Решение
Вы, вероятно, думаете о TMPDIR
.
Эта переменная должна представлять путь к каталогу, доступному для программ, которым требуется место для создания временных файлов.
Другие советы
Хорошим способом создания временного каталога является использование mktemp, например
mktemp -d -t
Таким образом, вы даже можете быть уверены, что имена ваших файлов не будут совпадать с существующими файлами.
POSIX / FHS говорит, что /tmp
является корневым каталогом для временных файлов, хотя некоторые программы могут предпочесть проверку $TEMP
или $TMP
вместо этого.
Подобно тому, что сказал @Chris Lercher, я нахожу, что это работает для меня:
dirname $(mktemp -u -t tmp.XXXXXXXXXX)
Это фактически не создаст временный файл (из-за флага -u для mktemp), но предоставит вам каталог, в который будут записаны временные файлы.Этот фрагмент работает на OSX и Ubuntu (возможно, и на других * nix тоже).
Если вы хотите установить его в переменную, сделайте что-то вроде этого:
TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`
# prompt>
printenv | sort
$TMP не является объявлять(d)
# So, prompt> (i.e. if [ -d /tmp ] is true)
export TMP="/tmp"
export
?Для того, чтобы передать переменные в подоболочку.
Кроме того, используйте $TMPDIR, если задано, это правильное имя переменной для Linux. И да, я действительно использую каталог /tmp;файлы будут удалены, по крайней мере, при перезагрузке.!.
К вашему сведению - ubuntu (и я предполагаю, что другие дистрибутивы на базе systemd) определяет переменную XDG_RUNTIME_DIR, которая является временным пространством для каждого пользователя, поэтому немного более безопасна, чем просто /tmp :
$ echo $XDG_RUNTIME_DIR /выполнить/пользователь/1000
$ ls -ld $XDG_RUNTIME_DIR drwx------ 2 ubuntu ubuntu 40 22 декабря 15:18 /выполнить/пользователь/1000
Я думаю, что XDG_RUNTIME_DIR поддерживается systemd / pam, поэтому он не будет установлен в Docker или других несистемных средах.
Вы можете сделать что-то подобное в ~/.bashrc, если хотите:
экспорт TEMP="${XDG_RUNTIME_DIR:-/tmp}"
Видишь:https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html https://www.freedesktop.org/wiki/
Также - мне кажется, есть некоторые оговорки с XDG_RUNTIME_DIR и sudo:https://unix.stackexchange.com/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user