Was nützt die Option -f für "touch"?

23

Von man touch:

-f     (ignored)

Aber ich verstehe nicht, was mit ignoriert gemeint ist .

Ich habe folgendes versucht:

$ 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

Und bemerkte, dass es trotz Zeitstempel ändert -f.

Also, ich möchte wissen, wofür -fsteht oder was es tut.

Pandya
quelle
2
Ich gehe davon aus, dass -fals Option nur ignoriert wird. Vielleicht durch das Argument Parser verstümmelt und das wars.
Thomas
1
(ignoriert) bedeutet, dass das Flag ignoriert wird, nicht der Befehl.
Fund Monica's Lawsuit

Antworten:

47

Für GNU-Dienstprogramme befindet sich die vollständige Dokumentation auf der infoSeite, auf der Sie lesen können:

-f
Ignoriert; für die Kompatibilität mit BSD-Versionen von `touch '.

Siehe historischen BSD Manpages für Touch , wo -fwar zu zwingen , die Berührung.

Wenn Sie sich die Quelle dieser alten BSDs ansehen, gab es keinen utimes()Systemaufruf. touchÖffnen Sie die Datei im Lese- / Schreibmodus, lesen Sie ein Byte, suchen Sie sie zurück und schreiben Sie sie erneut, um den letzten Zugriff und die letzte Änderungszeit zu aktualisieren .

Offensichtlich brauchten Sie sowohl Lese- als auch Schreibberechtigungen ( touchwürden es vermeiden, dies zu tun, wenn Sie access(W_OK|R_OK)false zurückgeben ). -fhabe versucht, das zu umgehen , indem ich die Berechtigungen vorübergehend auf 0666 ändere !

0666 bedeutet Lese- und Schreibberechtigung für alle. Es musste sein, dass ansonsten (wie bei einer restriktiveren Berechtigung wie 0600, die das Berühren noch erlaubt hätte ) Prozesse, die ansonsten Lese- oder Schreibberechtigung für die Datei hätten, während dieses kurzen Fensters nicht mehr möglich waren , Funktionalität zu brechen .

Dies bedeutet jedoch, dass Prozesse, die sonst keinen Zugriff auf die Datei hätten, jetzt eine kurze Gelegenheit haben, sie zu öffnen, wodurch die Sicherheit verletzt wird .

Das ist nicht sehr sinnvoll. Moderne touchImplementierungen machen das nicht. Seitdem wurde der utime()Systemaufruf eingeführt, der es ermöglicht, Änderungen und Zugriffszeiten separat vorzunehmen, ohne sich mit dem Inhalt der Dateien vermischen zu müssen (was bedeutet, dass er auch mit nicht regulären Dateien funktioniert) und nur dafür Schreibzugriff benötigt.

GNU touchschlägt immer noch nicht fehl, wenn die -fOption übergeben wird, sondern ignoriert einfach das Flag. Auf diese Weise schlagen Skripte, die für diese alten BSD-Versionen geschrieben wurden, bei der Portierung auf GNU-Systeme nicht fehl. Heutzutage wenig relevant.

Stéphane Chazelas
quelle
3
Laut developer.apple.com/library/mac/documentation/Darwin/Reference/… -f funktioniert dies unter Mac OS X weiterhin. )
alephzero
20
Die Verwendung der GUI ist nicht unbedingt "besser". Bei der Verwendung von Skripten geht es darum, Dinge zu automatisieren. Dazu gehört auch, sicherzustellen, dass Ihr Skript in möglichst vielen Dialekten unverändert ausgeführt wird oder zumindest in den meisten Dialekten, auf die Sie wahrscheinlich stoßen. In diesem Fall werden diese veralteten Kompatibilitätsprobleme zu einem Problem .
Guntram Blohm unterstützt Monica am
@alephzero Das liegt daran, dass die Version in OS X die BSD-Version ist, mit der GNU die Kompatibilität aufrechterhält.
Barmar
14

-ftut nichts. Es wird aus Gründen der historischen Kompatibilität (mit BSD touchgemäß info touch) aufbewahrt, damit Anwendungen, die es erwarten, es nicht weitergeben und eine Fehlermeldung erhalten, die besagt, dass es nicht existiert. Unter der Annahme, dass dies GNU-Coreutils sind, können Sie in der Quelle sehen, dass dies nur einen breakOut-of-the-Option-Verarbeitungsschalter ausführt, ohne etwas zu tun.

Wird ignoriert und -fist ab der allerersten Version des touch1992 hinzugefügten GNU- Befehls verfügbar ( siehe diff ). Es scheint, dass zumindest in FreeBSD v9 -f"versucht wird, das Update zu erzwingen, auch wenn die Dateiberechtigungen dies derzeit nicht zulassen" (wie von Sukminder gefunden, danke).

Chris Down
quelle
2
infoSeite sagt ignoriert; für die Kompatibilität mit BSD-Versionen von `touch '.
Heemayl
@heemayl Abgesehen davon, dass ich kein BSD gefunden habe, das mit einem "-f" -Argument zum Anfassen ausgeliefert zu werden scheint, muss es also ziemlich alt sein.
Chris Down
Hmm .. Ich habe gerade das Coreutils-Handbuch überprüft , in dem steht: "Ignoriert; auf Kompatibilität mit BSD-Versionen von touch."
Pandya
3
-fwird / wurde verwendet, um ein Update zu erzwingen, auch wenn Dateiberechtigungen dies für BSD zulassen. Nicht in V10, sondern in v9: freebsd.org/cgi/… (mindestens von FreeBSD).
Runium
@sukminder Ace, danke! Ich werde Ihre Informationen in die Antwort einfügen.
Chris Down
12

Immer wenn Sie in der Ausgabe von --help oder in einer Manpage "Option X wird ignoriert" sehen, bedeutet dies: Das Programm akzeptiert Option X - Sie erhalten keinen Syntaxfehler - aber es hat keine Auswirkung. Das Programm macht dasselbe wie ohne die Option.

Wie die anderen Antworten zeigen, erfolgt dies aus Gründen der Abwärtskompatibilität. Eine Option, die verwendet wurde, um einen gewissen Effekt zu erzielen, ist nicht mehr nützlich, und unabhängig von der Option das gleiche zu tun, ist das richtige Kompatibilitätsverhalten.

zwol
quelle
0

Wenn Sie sich den Kommentar im historischen Quellcode ansehen , schreiben Sie in Zeile 22:

  22   -f                     (ignored)\n\

Die Option -f sollte seit der ersten Veröffentlichung von Jim Meyering ignoriert werden.

Und die switch-Anweisung zum Behandeln von Optionen hat einen expliziten Fall (Zeilen 150/151), um nichts zu tun:

 150         case 'f':
 151           break;

Es ist bemerkenswert, was die folgenden Autoren seit 1992 motiviert hat, diese Option ignoriert zu lassen. Vielleicht gibt es ein Nutzungsszenario, das die Option -f erfordert und ansonsten abbricht?

Wir sehen
quelle