Birden fazla platformda doğru tmp dir'in bulunması


46

Çalışması için geçici dosyalar oluşturması ve kendisinden sonra temizlemesi gereken bir betiğim var. Sorum geçici dosyalar için doğru dizini bulmakla ilgili.

Script birden fazla platformda çalışması gerekiyor: Git Bash (Windows), Solaris, Linux, OSX. Her platformda, tercih edilen geçici dizin farklı şekilde ifade edilir:

  • Windows: %TMP%(ve muhtemelen %TEMP%)
  • OSX: $TMPDIR
  • Linux, UNIX: $TMPDIRdenedim ama denedim birden fazla sistemde üzülecek gibi görünüyor

Böylece senaryomda bu kazanı ekledim:

if test -d "$TMPDIR"; then
    :
elif test -d "$TMP"; then
    TMPDIR=$TMP
elif test -d /var/tmp; then
    TMPDIR=/var/tmp
else
    TMPDIR=/tmp
fi

Bu çok sıkıcı görünüyor. Daha iyi bir yolu var mı?


6
Sadece ${TMPDIR-/tmp}Unix beğenileri üzerinde kullanın . geçici dosyalar için TMPDIRne zaman kullanılmayacağını size söyleyen (sistem veya yönetici veya kullanıcı tarafından) /tmp.
Stéphane Chazelas

Yanıtlar:


72

Geçici dosyaları işlemek için biraz daha taşınabilir bir yol kullanmaktır mktemp. Geçici dosyalar oluşturacak ve onların yollarını sizin için geri getirecektir. Örneğin:

$ mktemp
/tmp/tmp.zVNygt4o7P
$ ls /tmp/tmp.zVNygt4o7P
/tmp/tmp.zVNygt4o7P

Bir komut dosyasında oldukça kolay bir şekilde kullanabilirsiniz:

tmpfile=$(mktemp)
echo "Some temp. data..." > $tmpfile
rm $tmpfile

Kılavuz sayfasını okuyarak, seçenekleri ihtiyaçlarınıza göre ayarlayabilmelisiniz. Örneğin:

  • -d dosya yerine bir dizin oluşturur.
  • -u bir isim oluşturur, fakat hiçbir şey yaratmaz.

Kullanarak -ugeçici dizini kolayca alabilir ...

$ tmpdir=$(dirname $(mktemp -u))

Daha fazla bilgiyi mktempburada bulabilirsiniz .

Mac OS X ile ilgili düzenleme: Daha önce hiç Mac OSX sistemi kullanmadım, ancak aşağıdaki Tyilo tarafından yapılan açıklamaya göre, Macmktemp OSX'ler bir şablon (örneğin, Linux'ta isteğe bağlı bir argüman olan) sağlamanızı istiyor gibi görünüyor . Alıntı yapmak:

Şablon, örneğin "X" sayısı eklenmiş herhangi bir dosya adı olabilir /tmp/temp.XXXX. Sondaki "X'ler", geçerli işlem numarası ve / veya benzersiz bir harf kombinasyonuyla değiştirilir. Mktemp'nin döndürebileceği benzersiz dosya adlarının sayısı, sağlanan "Xs" sayısına bağlıdır; altı "X", 56800235584 (62 ** 6) olası dosya adından 1'inin seçilmesiyle sonuçlanır.

Man sayfası ayrıca, bu uygulamanın OpenBSD man sayfasından ilham aldığını da söylüyor mktemp. Bu nedenle benzer bir ayrışma OpenBSD ve FreeBSD kullanıcıları tarafından da gözlemlenebilir ( Geçmiş bölümüne bakınız).

Şimdi, muhtemelen fark ettiğiniz gibi, bu, sorunuzda aradığınız geçici dizin de dahil olmak üzere tam bir dosya yolu belirlemenizi gerektirir. Bu küçük sorun, -tanahtar kullanılarak ele alınabilir . Bu seçenek bir argüman (gerektirecek gibi görünüyor olsa da prefix), o kadar görünür mktempdayanır $TMPDIRgerektiğinde.

Sonuç olarak, yukarıdaki sonuçları kullanarak aynı sonuçları elde edebilmelisiniz ...

$ tmpdir=$(dirname $(mktemp tmp.XXXXXXXXXX -ut))

Bu çözümü kendim test edemediğim için Mac OS X kullanıcılarından gelen geri bildirimler büyük memnuniyet duyacaktır.


OP şimdi silinen bir yorumda bu sorunu ele aldı; Korkarım gitbashkabuk arayüzü almayı gerektiren sistemlere cevap veremiyorum , bu yüzden "hafifçe". Aslında geçici dosyaların Windows'ta nerede depolandığını söyleyemem ...
John WH Smith

1
Aynen öyle. Biraz delirmiş c:\User\Name\..............\stuff. Ve muhtemelen 100 tanesi var. Yine de bazı linux dağıtımları, aynı delilik seviyesine yaklaşıyor /var. Sadece merak ettim. Her şeyi koymak için garip bir yol olarak beni etkiledi - benim deneyimimde hayal kırıklığı çok taşınabilir ve kolaylık azdı. Yine de çok iyi cevap.
mikeserv

1
Bir yıl kadar önce Win2K üzerinde çalışan Windows Restore Point dosyalarını WinXP'ye yönlendirmek için bir Bash betiği yazdım (daha sonraki sürümler bunu farklı şekilde ele alır). Komut dosyası geçici dosyaları için WINDOWS/Tempveya Windows/Tempvarsayılan dizin olarak kullanır ; Bu dizin aynı zamanda Windows 7 makinelerinde de var. Ancak betiğim, kullanıcının komut satırında alternatif bir geçici dir vermesini sağlar.
PM 2Ring

Bu, bir şablon sağlamanız gerektiği için OS X üzerinde çalışmaz mktemp.
Tyilo

1
El Capitan'dan beri, mktempsadece çalışır: basit mktempbir dosya mktemp -ddöndürür ve bir dizin döndürür; şablon gerekmez. El kitabı yine de güncellenmedi.
Franklin Yu,

9

Aynı şeyi daha az satırda arıyorsanız ...

for TMPDIR in "$TMPDIR" "$TMP" /var/tmp /tmp
do
    test -d "$TMPDIR" && break
done

Bunu bir tanesine yazabilirsin.


Yazılabilir olup olmadığını da muhtemelen test etmelisiniz.
frostschutz

@ janos: Ve diğerleri başarısız olursa, kullanıcıdan geçici dosyalar için bir yol sağlamasını isteyin veya komut satırında bir tane belirtmesine izin verin.
PM 2Ring

6

Yapabilirsin:

: "${TMPDIR:=${TMP:-$(CDPATH=/var:/; cd -P tmp)}}"
cd -- "${TMPDIR:?NO TEMP DIRECTORY FOUND!}" || exit

Kabuk, 4 alternatifin birinde çalıştırılabilir bir dizin bulmalı veya anlamlı bir hatayla çıkmalıdır. Yine de POSIX $TMPDIRdeğişkeni tanımlar (XCU sistemleri için) :

TMPDIR Bu değişken, geçici dosyalar oluşturmak için bir yere ihtiyaç duyan programlar için kullanıma sunulan bir dizinin yolunu gösterir.

Ayrıca /tmpyolu gerektirir .


1
IMO burada tek doğru cevap budur. Dunno ne yaptığını oylama olmadan altta oturuyor ...
Graeme

2
@Graeme: Belki de tamamen okunamadığı için mi?
ssc

Ben yükseldim ama sonra geri çekildi - evet, bu cevap bir karışıklık, Yararlı bir iz gibi gözüküyor, ama kod pasajının ne yapmaya çalıştığı belli değil, ilk satır bir yorum ve ikinci biri bir hatadır (zaten bash'ta). Bazı işler kullanabilir.
Don Hatch

Oh, görüyorum ki, cevabın ilk versiyonu daha açıktı (gerçekte çalıştırmayı denersen 2. hatta hala bir hata vardı) ... ve sonra bir dizi düzenleme kod örneğini tamamen sildi, bu yüzden şimdi saçmalık. Başka bir pas veya iki tane kullanabilir miyiz :-)
Don Hatch
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.