Mir ist bekannt, dass der touch
Befehl zum Aktualisieren des Datums der letzten Änderung an einer Datei verwendet wird. Es wird auch zum Erstellen einer neuen Datei verwendet, wenn die angeforderte Datei im Dateisystem nicht vorhanden ist.
Da touch (wie der Name schon sagt) nur das letzte Änderungsdatum aktualisieren sollte, warum wird dann auch versucht, eine neue Datei zu erstellen?
Ist es nur ein Scheck, der in den Code der Berührung geschrieben wurde, oder ist es etwas anderes, das zur Erstellung einer Datei führt?
touch /forcefsck
erstelle ich eine leere Datei, die aufgerufen wird, um/forcefsck
zu erzwingen, dass Dateisysteme beim nächsten Neustart auf Fehler überprüft werden. Die Datei selbst muss nichts enthalten, sie muss nur existieren. Ohnetouch
müsste ich eine leere Datei verwendenvi
odernano
speichern. Viel schneller zu bedienentouch
.>/forcefsck
oderprintf '' >>/forcefsck
(letzterer würde vorhandene Inhalte beibehalten). Was Sie beschreiben, ist eine Möglichkeit, ein Dienstprogramm zu verwenden, das auf eine bestimmte Art und Weise funktioniert, aber das hat keinen wirklichen Einfluss darauf, warum es so geschrieben wurde.touch
als um die Funktionsweise geht,touch
verstößt das Prinzip der Einzelverantwortung mit dem Nebeneffekt der Dateierstellung. Daher ist das "Warum" einfach auf frühe Designentscheidungen zurückzuführen, die aufgrund der Popularität und Verbreitung / Benutzerfreundlichkeit hängengeblieben sind.Antworten:
Mit
strace touch t
ergibt:Es ist im
touch
Code und ich würde es nicht als Scheck bezeichnen . Der Zeitstempel wird aktualisiert, indem die Datei zum Schreiben geöffnet und dann einfach geschlossen wird.quelle
touch
Erstellt eine neue, leere Datei, wenn die Datei nicht vorhanden ist, da sie dafür vorgesehen ist. Das Dienstprogramm muss Code enthalten, um diesen Fall speziell zu behandeln. Das Dienstprogramm erschien in Unix V7 ; sein Handbuch beschrieb es so:(Ich weiß nicht, was
touch
passiert ist, wenn die Datei leer ist. Der zugrunde liegende Systemaufruf kam später.)Ich weiß nicht genau, warum
touch
die Datei existieren soll, aber ich vermute, es liegt daranmake
. Warum möchten Sie die Änderungszeit einer Datei auf die aktuelle Zeit einstellen? Es gibt Fälle, in denen es nützlich sein könnte, die Änderungszeit auf eine bestimmte Zeit einzustellen, aber diese Fähigkeit kam später, das Originaltouch
konnte die Änderungszeit nur auf die aktuelle Zeit einstellen. Ein Grund dafür ist die erneute Ausführung einermake
Regel, die von der Datei abhängt.Das heißt, dass Sie eine Datei haben
foo
, und eine Make - Datei , die einen Befehl zu erzeugen , erklärtbar
ausfoo
. Bei der Eingabemake bar
wird der Befehl ausgeführt undbar
erstellt. Wennbar
vorhanden und neuer alsfoo
,make bar
tut das nichts, damake
davon ausgegangen wird, dass diesbar
bereits generiert wurde. Wennbar
jedoch älter alsfoo
ist, denkt make, dass diesbar
nicht aktuell ist und neu generiert werden muss.Aber was ist, wenn sich die zu generierenden Regeln
bar
geändert haben? Dann haben Sie zwei Möglichkeiten:rm bar; make bar
touch foo; make bar
Sie müssten
foo
existieren, um zu generierenbar
, sonst würde der Befehl normalerweise nicht funktionieren.Die „Touch“ -Terminologie war auch im
make
Dienstprogramm vorhanden:make -t bar
würde nur so tun, als würden die Befehle ausgeführt, das heißt, es würde die Änderungszeitbar
auf die aktuelle Zeit gesetzt, ohne den zu generierenden Befehl tatsächlich auszuführenbar
(Sie würden dies tun, wenn Sie das dachten) die änderungenfoo
sollen sich nicht auswirkenbar
). Dastouch
Dienstprogramm war daher eine eigenständige Version dermake -t
Funktion.quelle