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

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

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

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

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


person boatcoder    schedule 12.03.2010    source источник
comment
Как это слишком локализовано? Я почти уверен, что несколько человек используют временные файлы в Linux.   -  person Cascabel    schedule 12.03.2010


Ответы (6)


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

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

person Alok Singhal    schedule 12.03.2010
comment
Мои установки Ubuntu LTS Server 12.04 и 14.04 по умолчанию не имеют никаких переменных среды, касающихся временного каталога, ни TMPDIR, ни TMP, ни TEMP, даже если TMPDIR задокументирован в некоторых местах. В конце концов, эта переменная кажется ненадежной (уже). - person Thorsten Schöning; 21.03.2016
comment
С резервом: TMPDIR="{${TMPDIR:-$(dirname $(mktemp))/}" - person Deilan; 18.07.2017

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

mktemp -d -t

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

person Chris Lercher    schedule 12.03.2010
comment
Это хороший ответ, но это не ответ на вопрос выше. - person Jean Jordaan; 17.07.2013
comment
mktemp учитывает TMPDIR, так что это лучше, чем использовать переменную саму по себе - person Diego Torres Milano; 15.07.2021

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

person Ignacio Vazquez-Abrams    schedule 12.03.2010

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

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

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

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

TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`
person Tom Saleeba    schedule 08.04.2016
comment
Или просто: dirname $(mktemp -u). - person ekhumoro; 28.12.2016

Global variables command. [ Useful ]
# Let's look at environment variable's
printenv | sort
# search for TMP var
printenv | grep TMP
$TMP is not declared, because it's $TMPDIR [ Answer ]
## [ -d /tmp ] && echo 'is true' 
export TMP='/tmp' # In order to pass variables to a subshell.

Используйте $TMPDIR , это правильное имя переменной для Linux. Примечание: содержимое каталога /tmp (файлы) будет удалено при завершении работы/перезагрузке. Этого следует ожидать/желать.

person JimmyLandStudios    schedule 03.04.2016

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

$ echo $XDG_RUNTIME_DIR

/run/user/1000
$ ls -ld $XDG_RUNTIME_DIR

drwx------ 2 ubuntu ubuntu 40 Dec 22 15:18 /run/user/1000

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

Вы можете сделать что-то подобное в ~/.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/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user

person Reuben    schedule 22.12.2017