Что случилось с переменной окружения TMP?

StackOverflow https://stackoverflow.com/questions/2435062

  •  19-09-2019
  •  | 
  •  

Вопрос

Я всегда слышал, что правильный способ найти временную папку на компьютере 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top