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 -f
steht oder was es tut.
-f
als Option nur ignoriert wird. Vielleicht durch das Argument Parser verstümmelt und das wars.Antworten:
Für GNU-Dienstprogramme befindet sich die vollständige Dokumentation auf der
info
Seite, auf der Sie lesen können:Siehe historischen BSD Manpages für Touch , wo
-f
war 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 (
touch
würden es vermeiden, dies zu tun, wenn Sieaccess(W_OK|R_OK)
false zurückgeben ).-f
habe 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
touch
Implementierungen machen das nicht. Seitdem wurde derutime()
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
touch
schlägt immer noch nicht fehl, wenn die-f
Option ü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.quelle
-f
funktioniert dies unter Mac OS X weiterhin. )-f
tut nichts. Es wird aus Gründen der historischen Kompatibilität (mit BSDtouch
gemäß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 einenbreak
Out-of-the-Option-Verarbeitungsschalter ausführt, ohne etwas zu tun.Wird ignoriert und
-f
ist ab der allerersten Version destouch
1992 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).quelle
info
Seite sagt ignoriert; für die Kompatibilität mit BSD-Versionen von `touch '.-f
wird / 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).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.
quelle
Wenn Sie sich den Kommentar im historischen Quellcode ansehen , schreiben Sie in Zeile 22:
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:
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?
quelle