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.