OS X'te mktemp için düzeltme veya alternatif


73

Başka birinin yazdığı bir bash komut dosyasına bakıyorum mktemp:

TEMP=`mktemp --directory`

Ancak, bu satır makinemde çalışmıyor (OS X 10.6).

Bu çizgiyi, x-like-platform-platformuyla uyumlu olacak şekilde nasıl düzeltebilirim? EDIT: Alternatif bir komut da yeterli olacaktır.

Yanıtlar:


109

Aşağıdakiler, hem Linux hem de Darwin (Mac OS X 10.11'den önceki tüm sürümler) üzerinde, kodlamadan $TMPDIRveya kodlamadan çalışan geçici bir dizin oluşturmak için kullanmaya başladığım şeydi /tmp:

mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`

Arka fon:

GNU mktemp komutu hiçbir argüman gerektirmez. Düz mktempçalışacak ve sistemin geçici dizinde geçici bir dosya oluşturur.

Düz mktemp -d, Linux'ta kullanmak istediğin dosya yerine bir dizin oluşturur.

(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..

Varsayılan olarak, GNU mktemp tmp.XXXXXXXXXX, alt dizinin (veya dosyanın) adı için şablonu kullanır . Bu şablonu özelleştirmek için, -tseçenek kullanılabilir.

OSX'in mktemp varsayılan şablonu yoktur ve belirtilmesi gereken bir şablon gerektirir. Ne yazık ki, GNU mktemp, şablonu -tseçenek olarak alırsa , OSX'te bu konum argümanı olarak iletilir. Bunun yerine, OSX'in mktemp'i -tbaşka bir şey ifade eden bir seçeneğe sahiptir. -tOSX üzerinde seçenek şablon için bir "ön eki" olarak belgelenmiştir. Genişletilir {prefix}.XXXXXXXX, böylece X'leri otomatik olarak ekler (örn . Temp dizininde mktemp -d -t exampleoluşturabilir example.zEJZWCTQ).

Birçok Linux ortamlarında, bulmak şaşırdı $TMPDIRedilir değil varsayılan olarak ayarlanır. Birçok CLI programları ayarlarken bunu destekleyecek, ama yine de bir varsayılan gerek /tmp. Bu geçen demektir $TMPDIR/example.XXXXXXXXmktemp'in veya mkdir olduğu için tehlikeli o üretebilir çünkü /example.XXXXXXXX(nedeniyle $ TMPDIR için unset olmak ve boş bir dize haline) yerel diskin kök dizininde.

OSX'te, $TMPDIRher zaman ayarlanır ve (en azından varsayılan kabukta), /tmp(bir işaret bağlantısıdır /private/tmp) olarak değil, olarak ayarlanır /var/folders/dx/*****_*************/T. Öyleyse OSX için ne yaparsak yapalım, bu varsayılan davranışı onurlandırmalıyız.

Sonuç olarak, aşağıdakiler, hem Linux hem de Darwin'de (Mac OS X) çalışan geçici bir dizin oluşturmak için ya $TMPDIRda herhangi birisini kodlamadan güvenli bir şekilde kullanmak için kullandığım şeydir /tmp:

mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`

İlk bölüm Linux içindir. Bu komut, Darwin'de (Mac OS X) 1, "use: ..." ile yanıt veren hata durum koduyla başarısız olur . Bu yüzden stderr'i yok sayarız ve bunun yerine Mac değişkenini çalıştırırız. mytmpdirÖnek sadece (bu seçenek ayarlanması gereklidir) Mac üzerinde kullanılır.


12
Gerçekten havalı. Bazen OS X farklı davranış rahatsız edicidir.
— therealmarv

6
@therealmarv Her zaman söylemeyi tercih ederim.
— Nikita Volkov

10
Sadece mktemp -dOS X 10.11.5 El Capitan'ı kullandım ve beklendiği gibi çalıştı file $(mktemp -d):: /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
— Heath Borders

2
Evet. Bu Just Worked ™ olduğun için şaşırdım.
— Heath Borders

1
Koşarsan Ayrıca mktemp -d -t 'mytmpdir'Linux üzerinde (test mktempgelen coreutils 8.26beklendiği gibi), işe yarıyor.

15

Bir şablon sağlamalısınız. mktemp -d /tmp/foo.XXXXçalışmalı. Ben görmedim --directory. Bunun --bir GNU uzantısı olduğunu gösteriyor.


6
Kullanılabilir $TMPDIRolduğunda kullanmak istiyorsanız , yapın mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX. Bu Mac'te bash ve Debian'da kısa çizgi üzerinde çalışıyor, bu yüzden taşınabilir görünüyor.
— Tom Anderson,

9

Değişim --directoryiçin -d. Eski bir GNU-ism, ancak mktempçekirdek elemanlardan GNU da destekliyor -d. mktempOS X BSD'den aynıdır, bu nedenle -daslında bir gemi sistemleri arasında oldukça taşınabilir olmalıdır mktempprogramı.


Sadece denedim mktemp -dve o da işe yaramadı.
— akıl hocası.

1
Kyle tam bir cevabı var. Açık mktempOS X bir şablon gerektirir. Kullanmakta olduğunuz komut dosyası, hiçbiri sağlanmazsa varsayılan bir şablon kullanan GNU kurallarını varsayar.
— James Sneeringer

Buradaki sorun, unix'in XXXXXOS X'in uyumlu bir şablon bayrağı olup olmadığından emin olamadığı durumlarda tedarik edilmesini beklemesidir .
— user3467349

2
mktempOS X 10.11.5'de El Capitan benim için çalışıyor file $(mktemp -d)::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
— Heath Borders

4
temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX")"
  • mktempBSD için ( OSX dahil ) bir şablon gerektirir, ancak şablonda herhangi bir sayıya izin verir X.
  • mktempLinux için (GNU) bir şablon gerektirmez, ancak bir şablon belirtilirse, Xs sayısı 6 olmalıdır.

O Not -tiçin kullanımdan kaldırıldı GNUmktemp daha geleceğe yönelik bir kod olacak böylece,

temp_dir="$(mktemp -q -d -t "$(basename "$0").XXXXXX" 2>/dev/null || mktemp -q -d)"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.