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.