Відповіді:
Далі - це те, що я в кінцевому підсумку використав для надійного створення тимчасового каталогу, який працює як в Linux, так і в Дарвіні (всі версії до Mac OS X 10.11), без жорсткого кодування $TMPDIR
або /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Команда GNU mktemp не потребує аргументів. Plain mktemp
буде працювати і створює тимчасовий файл у тимчасовому каталозі системи.
Plain 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 є -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. Ця команда не вдасться в Дарвіні (Mac OS X) з кодом статусу помилки у 1
відповідь на "використання: ...". Ось чому ми ігноруємо stderr і замість цього виконуємо варіант Mac. mytmpdir
Префікс використовується тільки на Mac (де потрібно , щоб встановити , що опція).
mktemp -d
на OS X 10.11.5 El Capitan, і він працював так, як очікувалося file $(mktemp -d)
:: /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
Вам потрібно надати шаблон. mktemp -d /tmp/foo.XXXX
повинен працювати. Я ніколи не бачив --directory
. Це --
дозволяє припустити, що це розширення GNU.
$TMPDIR
коли вони є, зробіть це mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
. Це працює в bash на Mac і тире на Debian, тому здається портативним.
Змінити --directory
на -d
. Перший - це GNU-ism, але GNU mktemp
від coreutils також підтримує -d
. В mktemp
OS X те саме, що і в BSD, тому -d
має бути досить портативним серед систем, які фактично постачають mktemp
програму.
mktemp -d
, і це не працює.
mktemp
OS X потрібен шаблон. Сценарій, який ви використовуєте, передбачає конвенції GNU, в яких використовується шаблон за замовчуванням, якщо жоден не надається.
XXXXX
бути включеним у шаблон, де як OS X не впевнений, чи є прапор сумісного шаблону?
mktemp
на OS X 10.11.5 El Capitan працює на мене file $(mktemp -d)
::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
mktemp
для BSD (включаючи OSX ) потрібен шаблон, але він дозволяє будь-яку кількість X
s у шаблоні.mktemp
для Linux не вимагає шаблон, однак, якщо шаблон вказаний, то кількість X
s має бути 6.Зауважте, що -t
це застаріле для GNUmktemp
, тому більш надійним у майбутньому буде код
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"