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.
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.
Yanıtlar:
Ç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 mkdir
aş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, mkdir
bir 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.
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.
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)