Зафиксируйте или альтернатива для mktemp в OS X

Для командной строки IRC самый популярный или наиболее часто используемый - вероятно, irssi. Это очень устойчиво, очень гибко, очень расширяемо со сценариями и темами расположения, очень хорошо зарегистрированными, и имеет достойное сообщество пользователей и сторонников.

77
27.01.2012, 01:06
4 ответа

Следующее - то, что я закончил тем, что использовал для надежного создания временного каталога, который работает и над 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 это передается как позиционный параметр. Вместо этого mktemp OSX имеет a -t опция, которая означает что-то еще. -t опция на OSX документируется как "префикс" для шаблона. Это расширено до {prefix}.XXXXXXXX, таким образом, это добавляет Xs к нему автоматически (например. 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 отвечание "использованием:...". Вот почему мы игнорируем stderr и вместо этого затем выполняем вариант Mac. mytmpdir префикс только используется на Mac (где та опция требуется, чтобы быть установленной).

116
27.01.2020, 19:30
  • 1
    Действительно прохладный. Иногда OS X другое поведение является раздражающим. –  therealmarv 22.08.2013, 12:55
  • 2
    @therealmarv, который я сказал бы, всегда. –  Nikita Volkov 26.11.2013, 20:44
  • 3
    я просто работал mktemp -d на OS X 10.11.5 El Capitan, и это работало как ожидалось: file $(mktemp -d): /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory –  Heath Borders 15.07.2016, 21:50
  • 4
    Да. Я был удивлен, как Вы были то, что это Просто Worked™. –  Heath Borders 22.07.2016, 21:02
  • 5
    Также, если Вы работаете mktemp -d -t 'mytmpdir' на Linux (протестированный с mktemp от coreutils 8.26), это работает как ожидалось. –   20.02.2017, 11:06

Изменение --directory кому: -d. Первый - изм GNU, но GNU mktemp от coreutils также поддерживает -d. mktemp в OS X совпадает с от BSD, таким образом, -d должно быть довольно портативным среди систем, это на самом деле поставляет a mktemp программа.

9
27.01.2020, 19:30
  • 1
    , который я просто попробовал mktemp -d, и это не работает также. –  soundly_typed 26.01.2012, 21:56
  • 2
    Kyle имеет полный ответ. mktemp на OS X требует шаблона. Сценарий, который Вы используете, принимает конвенции GNU, который использует шаблон по умолчанию, если ни один не предоставляется. –  James Sneeringer 26.01.2012, 23:24
  • 3
    Проблема состоит в том, что Unix ожидает XXXXX быть предоставленным в шаблоне, где, поскольку OS X не делает уверенный, если существует совместимый шаблонный флаг? –  user3467349 15.03.2016, 09:06
  • 4
    mktemp на OS X 10.11.5 работ El Capitan для меня: file $(mktemp -d): /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory –  Heath Borders 15.07.2016, 21:52

Необходимо предоставить шаблон. mktemp -d /tmp/foo.XXXX должен работать. Я никогда не видел --directory. -- предполагает, что это - расширение GNU.

15
27.01.2020, 19:30
  • 1
    Если Вы хотите использовать $TMPDIR когда доступно, сделать mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX. Это работает в ударе над Mac и тире на Debian, таким образом, это кажется портативным. –  Tom Anderson 15.04.2015, 10:36
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
  • mktemp для BSD (включая OSX) требуется шаблон, но он допускает любое количество Xs в шаблоне.
  • (GNU) mktemp для Linux не требует шаблона, однако, если шаблон указан, то число Xs должно быть 6.

Обратите внимание, что -t для GNU mktemp устарел, так что более перспективный код был бы

temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"
4
27.01.2020, 19:30

Теги

Похожие вопросы