Aşağıdakiler, hem Linux hem de Darwin (Mac OS X 10.11'den önceki tüm sürümler) üzerinde, kodlamadan $TMPDIR
veya 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, -t
seçenek kullanılabilir.
OSX'in mktemp varsayılan şablonu yoktur ve belirtilmesi gereken bir şablon gerektirir. Ne yazık ki, GNU mktemp, şablonu -t
seçenek olarak alırsa , OSX'te bu konum argümanı olarak iletilir. Bunun yerine, OSX'in mktemp'i -t
başka bir şey ifade eden bir seçeneğe sahiptir. -t
OSX ü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 example
oluşturabilir example.zEJZWCTQ
).
Birçok Linux ortamlarında, bulmak şaşırdı $TMPDIR
edilir 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.XXXXXXXX
mktemp'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, $TMPDIR
her 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 $TMPDIR
da 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.