Ara dosyalarım için geliştirici olarak hangi klasöre yazmalıyım?


17

Projem için birkaç bash komut dosyası yazmaya başlıyorum ve yazılacak bazı ara dosyalara veya değişkenlere ihtiyaçları var.

Birisi komut dosyamı çalıştırdığında hangi klasörlere erişebileceğimden emin olabileceğimi bilmek istiyorum? Kullanmak yaygın bir uygulama /tmp/mı? Yoksa başka bir şey mi kullanmalıyım?

Yanıtlar:


21

Bu dosyaları ararken Dosya Sistemi Hiyerarşi Standardı belgesini paha biçilmez buluyorum .

Birkaç seçenek var,

Bu gerçekten depoladığınız veri türüne bağlıdır.


kullanıcının / ortamın size sağladığı şeyi daha iyi kullanın ve yalnızca / tmp vb. yedek olarak kullanın. ( unix.stackexchange.com/a/79776/7784 ne dedi)
Oluf Lorenzen

15

Yalnızca komut dosyanız veya uygulamanız çalıştığı sürece devam eden bazı geçici dosyalar yazmanız gerekiyorsa, TMPDIRortam değişkeni tarafından belirtilen dizini kullanın veya bu değişken tanımlanmamışsa /tmp,.

/tmpbazı sistemlerde önyükleme zamanında temizlenir (bazen RAM'de bile, örneğin Solaris'te ve bazı Linux kurulumlarında varsayılan olarak), bu nedenle bir güç kesintisi veya yeniden başlatmadan kurtulması gereken dosyalar için kullanılamaz. /var/tmpyeniden başlatma işleminden sağ çıkması gereken, ancak sistem yöneticisi tarafından zaman zaman temizlenebilen dosyalar için kullanılabilir. Uygulamanızın dosyaları kalıcı olarak kaydetmesi gerekiyorsa, bunları kullanıcının ana dizininde ( ~/.programmingnoobsappveya içinde ~/.cache/programmingnoobsapp) veya altında /var/lib/programmingnoobsappveya altında bir yere yazın /var/cache/programmingnoobsapp.

/tmpTüm kullanıcılar arasında paylaşıldığını unutmayın , bu nedenle orada bir dosya oluştururken önlem almanız gerekir. Henüz mevcut olmayan bir dosya adı seçmeniz ve başka bir işlemin önünüzde dosyayı farklı izinlerle oluşturduğu bir yarış durumuna izin vermemeye dikkat etmeniz gerekir; farklı bir kullanıcı olarak çalışıyorsa, işleminizin verilerine erişebilir ve bunları değiştirebilir). Veya mktempiçinde bir dosya oluşturmak için komutu kullanın . Varsayılan olarak, bir dosya oluşturur , ya da eğer genellikle doğru yerde olan düzdür. Birden fazla geçici dosya kullanmanız gerekiyorsa veya tek bir dosyaya ihtiyacınız olsa bile, tüm geçici dosyalarınız için bir dizin oluşturmanızı öneririz./tmp/var/tmpmktemp$TMPDIR/tmpTMPDIRmktemp -d ve betiğinizin sonunda bunu kaldırabilirsiniz.

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

wrt to mktemp, komut dosyamın sonunda geçici dosyaları kaldırmam. Eski dosyaları otomatik olarak kaldıran bir tmpwatch cron işim var. Vakaların büyük çoğunluğunda, ara dosyayı okumadım ve sistem dosyaları kendi başına silecektir. Ancak, komut dosyasında bir sorun çıkarsa, kolay hata ayıklama için tüm ara dosyalarım var.
emory

1
İçin +1 mktemp. Benim için doğru cevap budur: geçici olarak güvenli bir dosya oluşturma görevini devredin mktemp( bu makaleye bakın ). Her ne kadar bir cevap alıntı FHSbüyük değeri vardır.
Carlos Campderrós

Atamadan tmp_rootönce neden başlattınız ? Daha doğal olmaz unsetmıydı?
l0b0

@ l0b0 İkisi de işe yarar (altında olanlar hariç set -u, ancak bu nadirdir). Betiğin tuzağı ayarladıktan hemen sonra öldürülmesi durumunda, tuzağı ayarlamadan önce güvenli bir değere ayarlanması gerekir (un).
Gilles 'SO- kötü olmayı bırak

Ben eklemek istiyorum set -o errexiteğer o kadar tmp_rootzaten salt okunur bir ortamda ayarlanır yanlış dizin yok etmeyecek ...
l0b0

2

Şimdiye kadar gönderilmiş olan cevapları tamamlamak için.

Orada da /dev/shmgeçici depolama için kullanmak olabilir bazı Linux dağıtımlarında. Bu depolama yalnızca dosya G / Ç performansı, dosya sistemini /dev/shmkullanan kritik bir faktör olduğunda kullanılmalıdır tmpfs. Ayrıca makul boyutta dosyalar ve veriler için kullanılmalıdır. tmpfsBu önyükleme önyükleme kalıcı değildir bu yüzden dosya sistemi markaları depolama gibi bir sistem RAM kullanımı.

StackOverflow'da burada belirtilen tüm seçeneklere iyi bir genel bakış var: Linux'ta geçici dosya depolama için / tmp vs. / dev / shm? . Şu SuperUser Soru-Cevap başlıklı başlıkta iyi ele alınmıştır: / dev / shm / ne zaman ve / tmp kullanmalıyım? .

Referanslar


0

Evet, /tmpçoğunlukla geçici olarak gerekli dosyalar içindir. / Tmp, yalnızca öğenin sahibi, dizinin sahibi veya süper kullanıcının dosyaları yeniden adlandırabileceği veya silebileceği anlamına gelen yapışkan bitlere sahiptir. birçok program bunu kilit dosyaları oluşturmak ve verilerin geçici olarak saklanması için kullanır. Bazı dağıtımlarda, bu dizin önyükleme veya kapatma sırasında temizlenir.


1
Tüm / tmp dizinleri önyükleme sırasında temizlenmez. Örneğin, varsayılan AIX yüklemeleri yoktur (ve bu yalnızca Linux değil UNIX ve Linux'tur).
EightBitTony

Ancak, birçok durumda varsayılan gibi görünen "bellek" yerleşik ise, sistem herhangi bir nedenle durduğunda ortadan kaybolur.
mdpc
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.