Что случилось с переменной среды TMP?

Я всегда слышал, что правильный способ найти временную папку на машине UNIX - это посмотреть на переменную среды TMP. При написании кода, который работал как в Windows, так и в Linux, я бы проверял TEMP и TMP.

Сегодня я обнаружил, что моя установка Ubuntu не имеет такой переменной среды.

Я знаю, что, кажется, вы всегда можете рассчитывать на /tmp, чтобы туда помещали ваши временные файлы, но я понял, что TMP - это то, как пользователь мог сказать вам, чтобы временные файлы помещались куда-то еще.

Это все еще так?

Ответ 1

Вероятно, вы думаете о TMPDIR.

Эта переменная должна представлять собой путь к директории, доступной для программ, которым требуется место для создания временных файлов.

Ответ 2

Хорошим способом создания временного каталога является использование mktemp, например.

mktemp -d -t

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

Ответ 3

POSIX/FHS говорит, что /tmp является корнем для временных файлов, хотя некоторые программы могут вместо этого выбрать $TEMP или $TMP.

Ответ 4

Подобно тому, что сказал @Chris Lercher, я считаю, что это работает для меня:

dirname $(mktemp -u -t tmp.XXXXXXXXXX)

Это фактически не создаст временный файл (из-за флага -u в mktemp), но он даст вам каталог, в который будут записываться файлы temp. Этот фрагмент работает на OSX и Ubuntu (возможно, и на других * nix).

Если вы хотите установить его в переменную, выполните следующие действия:

TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`

Ответ 5

Глобальные переменные.
# prompt>
printenv | sort
$ TMP не объявляется (d)
# So, prompt> (i.e. if [ -d /tmp ] is true)
export TMP="/tmp"

export? Чтобы передать переменные в подоболочку.
Кроме того, используйте $TMPDIR, если он установлен, это правильное имя var для Linux. И Да, я использую каталог /tmp; файлы будут удалены, по крайней мере, при перезагрузке.!.

Ответ 6

FYI - ubuntu (и я предполагаю, что другие дистрибутивы на основе systemd) определяет переменную XDG_RUNTIME_DIR - это временное пространство для каждого пользователя, поэтому немного более безопасно, чем просто /tmp:

$echo $XDG_RUNTIME_DIR /Запустить/пользователь/1000

$ls -ld $XDG_RUNTIME_DIR drwx ------ 2 ubuntu ubuntu 40 дек. 22 15:18/run/user/1000

Я думаю, что XDG_RUNTIME_DIR поддерживается systemd/pam, поэтому он не будет установлено в Dockers или других несистемных средах.

Вы можете сделать что-то вроде этого в ~/.bashrc, если хотите:

export 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/info/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user