Touch neden yeni dosyalar oluşturuyor?


13

touchKomutun bir dosyadaki son değişiklik tarihini güncellemek için kullanıldığını biliyorum . İstenilen dosya dosya sisteminde yoksa yeni bir dosya oluşturmak için de kullanılır.

Dokunma (adından da anlaşılacağı gibi), yalnızca son mod tarihini güncellemesi gerektiğinden, neden yeni bir dosya oluşturmaya çalışıyor?

Bu sadece dokunma kodunda yazılmış bir çek mi, yoksa bir dosyanın oluşturulmasına neden olan başka bir şey mi?


Bir kullanım örneği olarak, dosya sistemlerini bir sonraki yeniden başlatma işleminde hatalara karşı denetlemeye zorlamak için touch /forcefsckadlandırılan boş bir dosya oluşturmak için kullanıyorum /forcefsck. Dosyanın kendisi herhangi bir şey içermesine gerek yoktur, sadece var olması gerekir. Olmadan touch, boş bir dosya kullanmam viveya nanokaydetmem gerekir . Kullanımı çok daha hızlı touch.
Tim

@Tim Kullanamamanız için gerçek bir neden yoktur ( >/forcefsckveya printf '' >>/forcefsckikincisi mevcut içeriği korur). Açıkladığınız, belirli bir şekilde çalışan bir yardımcı programı kullanmanın bir yoludur, ancak bu şekilde çalışmak için neden yazıldığına dair gerçek bir etkisi yoktur.
CVn

Bu soru touchnasıl çalıştığından ziyade tasarım hakkındaysa, touchtek Sorumluluk İlkesini dosya oluşturma yan etkisi ile ihlal ettiğini düşünüyorum . Bu nedenle, "neden" sadece popülerlik ve yaygınlık / kullanım kolaylığı nedeniyle takılan erken tasarım seçeneklerinden kaynaklanmaktadır.
George Pantazes

Yanıtlar:


15

strace touch tVerim kullanma :

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

Bu ise touchbireyin kod ve ben demezdim çek bile. Zaman damgası, dosyayı yazmak üzere açıp sadece kapatarak güncellenir.


14

touchdosya mevcut değilse yeni, boş bir dosya oluşturur, çünkü bunu yapmak için tasarlanmıştır. Yardımcı program, özellikle bu durumu işlemek için kod içermelidir. Yardımcı program Unix V7'de ortaya çıktı ; Bunu kılavuzu böylece bunu açıklar

dokunma - dosyanın son değiştirilme tarihini güncelle

touchher dosyanın değiştirilme tarihini ayarlamaya çalışır . Bu, dosyadaki bir karakteri okuyarak ve geri yazarak yapılır. Bir ** dosyası * yoksa, -cseçenek belirtilmedikçe dosya oluşturulmaya çalışılır .

( touchDosya boşsa ne yaptığını bilmiyorum . Temel sistem çağrısı daha sonra geldi.)

touchDosyayı neden var etmek için tasarlandığından emin değilim , ancak bunun yüzünden şüpheleniyorum make. Neden bir dosyanın değişiklik zamanını geçerli saate ayarlamak istiyorsunuz? Değişiklik zamanının belirli bir zamana ayarlanmasının yararlı olabileceği durumlar vardır, ancak bu yetenek daha sonra geldi, orijinal touchsadece değişiklik zamanını geçerli saate ayarlayabilir. Bunu yapmanın bir nedeni make, dosyaya bağlı bir kuralı yeniden çalıştırmaktır .

Olduğuna göre, bir dosya var varsayalım foove üretmek için bir komut ilan eden bir makefile bargelen foo. Yazdığınızda make bar, komut yürütülür ve baroluşturulur. Eğer barvarsa ve daha yeni foo, make barçünkü hiçbir şey yapmaz makevarsayar barzaten oluşturuldu. Ancak, bardaha eskiyse foo, bargüncel olmayan ve yenilenmesi gereken düşünceler yapın .

Peki ya oluşturulacak kurallar bardeğiştiyse? Sonra iki seçeneğiniz var:

  • rm bar; make bar
  • touch foo; make bar

Oluşturmak fooiçin var olmanız gerekir bar, aksi takdirde komut genellikle işe yaramaz.

makeYardımcı programda “dokunma” terminolojisi de mevcuttu : make -t baryalnızca komutları çalıştırıyormuş gibi yapardı, yani, baroluşturma komutunu gerçekten oluşturmadan komutu şimdiki zamana ayarlayacaktı bar(eğer bunu değişikliklerin fooetkilenmemesi gerekir bar). Bu touchnedenle yardımcı program, make -tözelliğin bağımsız bir sürümüdür .

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.