Tek bir dosyayı yoksa, atomik olarak bir dosya oluşturmak için bas


9

Atomik bir dosya yoksa atomik bir dosya oluşturan bir Bash tekli astar istiyorum. Bu, temelde "dosya yoksa, oluşturun" anlamına gelir, ancak if ve dosya oluşturma arasındaki küçük alanda başka hiç kimse dosyayı oluşturmayı başaramaz.


Üzgünüm, 'atomik olarak' otomatik olarak 'okudum. Cevabımı sildim.
Aaron Copley

Yanıtlar:


6

Çeşitli yorumlar ve [SO] ile bağlantılardan bir cevap çalmak . Bir var gibi görünüyor POSIX uyumlu yöntem içermez mkdiraşağıda benim orijinal cevapta belirtildiği şekilde

set -o noclobber # or set -C
{ > file ; } &> /dev/null

Dosyaya yapılan bu yönlendirme 0 döndürür veya başarısız olur ve dosya zaten varsa sıfırdan farklı bir değer döndürür.


Orijinal cevap

Kullanmanız gerekecek mkdir- bu atomik, ya dizin yaratılıyor ve devam edebilirsiniz ya da yaratılmıyor, böylece uygun eylemi gerçekleştiriyorsunuz.

Tabii ki, mkdirbir dosya oluşturmaz, ancak bir kez dizine özel erişiminiz olduğunu öğrendikten sonra içinde istediğiniz dosyayı yapabilirsiniz.

Tek bir astarla ilgili olarak - bunu size bırakacağım. Şahsen birkaç satır üzerine yazardım, çünkü bu daha sürdürülebilir olur.


Ancak stackoverflow.com/q/13828544/1207760 adresindeki noclobber, OP'nin istediği şeydir.
Yasa29

Noclobber genel olarak iyi bir cevaptır. Ama ksh88 için işe yaramıyor.
jrw32982 Monica

1
@JohnWiersba ama soru bash hakkında.
womble

@womble yes ama cevap, birisinin cevabın diğer kabuklar için geçerli olduğu anlamına gelebilecek POSIX'ten bahsediyor. Ksh88 hala bazı sunuculardaki standart kabuktur.
jrw32982 Monica

0

Dosya veya dizin mi? Dosya varsa, basit komut dokunuşunu kullanabilirsiniz - dosya varsa, sadece son erişim süresini değiştirir. Dosya yoksa, oluşturulur.


0

Bunu dene. lnBir test ve ayar işlevi sağlar.

touch lock.$$.tmp
if ln lock.$$.tmp lock.dat 2>/dev/null
then
    echo "File is mine"
else
    echo "Test and set failed"
fi
rm -f lock.$$.tmp

0

Dosya adını önemsemiyorsanız, bu görevi bir yardımcı programa, örneğin mktemp'e devredebilirsiniz

Create a temporary file or directory, safely, and print its name.
TEMPLATE must contain at least 3 consecutive `X's in last component.
If TEMPLATE is not spec‐ified, use tmp.XXXXXXXXXX, and --tmpdir is 
implied.  Files are created u+rw, and directories u+rwx, minus umask
restrictions.

çağırma:

filename=$(mktemp)
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.