Ниже приведено то, что я использовал для надежного создания временного каталога, который работает как в Linux, так и в Darwin (все версии до Mac OS X 10.11), без жесткого кодирования $TMPDIRили /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Фон:
Команда GNU mktemp не требует аргументов. Обычный mktempбудет работать и создает временный файл во временном каталоге системы.
Обычный mktemp -dсоздаст каталог вместо файла, который вы хотели бы использовать в Linux.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
По умолчанию GNU mktemp использует шаблон tmp.XXXXXXXXXXдля имени подкаталога (или файла). Чтобы настроить этот шаблон, -tможно использовать эту опцию.
Mktemp в OSX не имеет шаблона по умолчанию и требует указания шаблона. К сожалению, где GNU mktemp принимает шаблон в качестве -tопции, в OSX это передается как позиционный аргумент. Вместо этого в OSX mktemp есть -tопция, которая означает что-то еще. -tВариант на OSX документирован как «префикс» для шаблона. Он расширен до {prefix}.XXXXXXXX, поэтому он добавляет к нему X автоматически (например, mktemp -d -t exampleможет создать example.zEJZWCTQво временном каталоге).
Я с удивлением обнаружил , что во многих средах Linux, $TMPDIRэто не устанавливается по умолчанию. Многие программы CLI поддерживают его, когда они установлены, но все еще нуждаются в значении по умолчанию для /tmp. Это означает, что переход $TMPDIR/example.XXXXXXXXк mktemp или mkdir опасен, поскольку он может появиться /example.XXXXXXXXв корневом каталоге локального диска (из-за того, что $ TMPDIR не установлен и становится пустой строкой).
В OSX $TMPDIRвсегда устанавливается и (по крайней мере в оболочке по умолчанию) устанавливается не на /tmp(что является символической ссылкой /private/tmp), а на /var/folders/dx/*****_*************/T. Поэтому, что бы мы ни делали для OSX, следует соблюдать это поведение по умолчанию.
В заключение, следующее , что я в конечном итоге использовала , чтобы надежно создать временный каталог , который работает как на Linux и Darwin (Mac OS X), без жесткого кодирования либо $TMPDIRили /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Первая часть для Linux. Эта команда не удастся выполнить в Darwin (Mac OS X) с кодом ошибки, 1ответившим «use: ...». Вот почему мы игнорируем stderr и вместо этого запускаем вариант Mac. mytmpdirПрефикс используется только на Mac (где требуется , чтобы установить , что опция).