-F seçeneğinin `dokunma 'için kullanımı nedir?


23

Kimden man touch:

-f     (ignored)

Ama görmezden gelenin ne anlama geldiğini anlamadım .

Aşağıdakileri denedim:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

Ve buna rağmen zaman damgalarını değiştirdiğini fark ettim -f.

Bu yüzden, bunun ne -fanlama geldiğini veya ne anlama geldiğini bilmek istiyorum .


2
Sanırım -fseçenek olarak görmezden gelinir. Belki argüman ayrıştırıcı ile karışmış ve o kadar.
Thomas

1
(yoksayıldı), komutun değil bayrağın yoksayıldığını gösterir.
Fon Monica'nın Davası

Yanıtlar:


47

GNU yardımcı programları için, tam belge infookuyabileceğiniz sayfadadır:

-f
Yok Sayılan; 'dokunma' BSD sürümleri ile uyumluluk için.

Bkz dokunuş için tarihi BSD man sayfalarını , -foldu zorlamak dokunuş.

Bu eski BSD'lerin kaynağına bakarsanız, utimes()sistem çağrısı yapılmazdı , bu nedenle touchdosyayı okuma + yazma modunda açar, bir bayt okur, geriye doğru arar ve son erişimi ve son değişiklik zamanını güncellemek için tekrar yazar .

Açıkçası, hem gerekli okuma ve yazma izinleri ( touchyapmaya çalışıyor ki eğer önleyeceğini access(W_OK|R_OK)iade YANLıŞ ). geçici olarak izinleri geçici olarak değiştirerek 0666'ya-f çalışmayı denedim !

0666 herkese okuma ve yazma izni anlamına gelir. Aksi takdirde ( kısa bir süre zarfında dokunmaya izin vermiş olan 0600 gibi daha kısıtlayıcı bir izinle olduğu gibi ), bu kısa pencerede anlamına gelebilecek, aksi takdirde dosyaya okuma ya da yazma izni verebilecek olan süreçlerin artık çözülemeyeceği şekilde olmalıydı. işlevsellik kırma .

Ancak bu, başka bir şekilde dosyaya erişimi olmayacak olan işlemlerin şimdi açmak için kısa bir fırsata sahip olduğu ve güvenliği bozduğu anlamına gelir .

Bu yapılacak çok mantıklı bir şey değil. Modern touchuygulamalar bunu yapmaz. O zamandan bu yana, utime()sistem çağrısı tanıtıldı, dosyaların içeriğine karışmak zorunda kalmadan değişiklik yapma ve erişim zamanını ayrı ayrı değiştirmeye izin verdi (bu, normal olmayan dosyalarla de çalışır) ve yalnızca bunun için yazma erişimine ihtiyaç duyuyor.

GNU seçeneği touchgeçerse hala başarısız olmaz -f, ancak sadece bayrağı görmezden gelir. Bu şekilde, BSD'nin eski sürümleri için yazılmış komut dosyaları, GNU sistemlerine aktarıldığında başarısız olmaz. Bugünlerde pek alakalı değil.


3
Developer.apple.com/library/mac/documentation/Darwin/Reference/… 'e göre -fhala Mac OS X'te çalışmaktadır. (Ancak, şüphesiz GUI'yi kullanarak aynı işlevi "daha iyi" yapmanın en az 57 farklı yolu vardır! )
alephzero

20
GUI'yi kullanmak zorunlu olarak “daha ​​iyi” değildir. Komut dosyalarını kullanmanın amacı, komut dosyanızın olabildiğince çok unixy lehçesinde veya en azından karşılaşmanız gereken en lehçelerde değiştirilmediğinden emin olmanızı sağlamaktır. Bu, eski, kullanımdan kaldırılmış uyumluluk sorunlarının endişe duyduğu yerdir. .
Guntram Blohm

@alephzero Bunun nedeni OS X'teki sürümün GNU ile uyumluluğunu koruduğu BSD sürümüdür.
Barmar

14

-fhiç birşey yapmıyor. Tarihsel uyumluluk için saklanır (BSD'ye touchgöre info touch), var olmasını bekleyen uygulamalar geçemez ve var olmadığını söyleyen bir hata mesajı alır. Bunun GNU coreutils olduğunu varsayarak , kaynağında bunun breakhiçbir şey yapmadan sadece seçenek işleme anahtarının dışına çıktığını görebilirsiniz.

Yoksayılmış bir seçenek olarak, 1992'de eklenen -fGNU touchkomutunun ilk sürümünden itibaren mevcut ( bkz. Fark ). En azından FreeBSD v9'da, -f"dosya izinleri şu anda izin vermiyor olsa bile güncellemeyi zorlama girişimi" (ÖSMinder'in bulduğu gibi) olduğu anlaşılıyor.


2
infosayfa diyor Yok Say; 'dokunma' BSD sürümleri ile uyumluluk için.
heemayl

@heemayl Bunun dışında dokunmak için bir "-f" argümanıyla gemi gibi görünen bir BSD bulamadım, bu yüzden oldukça eski olmalı.
Chris Down

Hmm .. Ben sadece kontrol ettim manuel coreutils "; dokunma BSD sürümleri ile uyumluluk için yok sayılır.": Say,
Pandya

3
-fBSD'de dosya izinleri izin vermiş olsa bile güncellemeyi zorlamak için kullanılır. V10’da değil, v9’da : freebsd.org/cgi/… (en azından FreeBSD’den).
Runium

@sukminder Ace, teşekkürler! Bilgilerinizi cevaba ekleyeceğim.
Chris Down

12

Yardım çıktısında veya manpage'de "X seçeneğinin yoksayıldığını" gördüğünüzde, bunun anlamı: program X seçeneğini kabul eder - bir sözdizimi hatası almazsınız - ancak herhangi bir etkisi olmaz. Program, seçenek yokluğunda yapacağı şeyi yapar.

Diğer cevapların gösterdiği gibi, bu geriye dönük uyumluluk için yapılır. Bir seçenek kullanıldığında o ne yaptıysa bazı etkiye sahip, artık yararlı olduğunu ve ne olursa olsun seçeneğin aynı şeyi yapıyor doğru uyumluluk davranıştır.


0

Tarihi kaynak kodundaki açıklamaya bakarken , satır 22:

  22   -f                     (ignored)\n\

-f seçeneğinin Jim Meyering'in ilk sürümünden beri göz ardı edilmesi amaçlandı.

Ve seçenekleri işlemek için anahtar deyimi hiçbir şey yapmamak için açık bir dava (satır 150/151) vardır:

 150         case 'f':
 151           break;

Bu seçeneği göz ardı etmek için 1992'den beri aşağıdaki yazarları motive eden şey dikkat çekicidir. Belki -f seçeneğini gerektiren ve başka bir şekilde kırılan bir kullanım senaryosu vardı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.