Warum erstellt touch neue Dateien?

13

Mir ist bekannt, dass der touchBefehl 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?

Alex McCourt
quelle
Als Anwendungsfall touch /forcefsckerstelle ich eine leere Datei, die aufgerufen wird, um /forcefsckzu erzwingen, dass Dateisysteme beim nächsten Neustart auf Fehler überprüft werden. Die Datei selbst muss nichts enthalten, sie muss nur existieren. Ohne touchmüsste ich eine leere Datei verwenden vioder nanospeichern. Viel schneller zu bedienen touch.
Tim
@Tim Es gibt keinen wirklichen Grund, den Sie nicht verwenden könnten >/forcefsckoder printf '' >>/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.
einen Lebenslauf vom
Wenn es bei dieser Frage eher um das Design touchals um die Funktionsweise geht, touchverstöß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.
George Pantazes

Antworten:

15

Mit strace touch tergibt:

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

Es ist im touchCode 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.

VaTo
quelle
14

touchErstellt 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:

touch - Datum der letzten Änderung einer Datei

touchversucht, das Änderungsdatum jeder Datei festzulegen . Dies geschieht, indem ein Zeichen aus der Datei gelesen und zurückgeschrieben wird. Existiert keine ** Datei *, wird versucht, diese zu erstellen, sofern nicht die -cOption angegeben ist.

(Ich weiß nicht, was touchpassiert ist, wenn die Datei leer ist. Der zugrunde liegende Systemaufruf kam später.)

Ich weiß nicht genau, warum touchdie Datei existieren soll, aber ich vermute, es liegt daran make. 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 Original touchkonnte die Änderungszeit nur auf die aktuelle Zeit einstellen. Ein Grund dafür ist die erneute Ausführung einer makeRegel, 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ärt baraus foo. Bei der Eingabe make barwird der Befehl ausgeführt und barerstellt. Wenn barvorhanden und neuer als foo, make bartut das nichts, da makedavon ausgegangen wird, dass dies barbereits generiert wurde. Wenn barjedoch älter als fooist, denkt make, dass dies barnicht aktuell ist und neu generiert werden muss.

Aber was ist, wenn sich die zu generierenden Regeln bargeändert haben? Dann haben Sie zwei Möglichkeiten:

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

Sie müssten fooexistieren, um zu generieren bar, sonst würde der Befehl normalerweise nicht funktionieren.

Die „Touch“ -Terminologie war auch im makeDienstprogramm vorhanden: make -t barwürde nur so tun, als würden die Befehle ausgeführt, das heißt, es würde die Änderungszeit barauf die aktuelle Zeit gesetzt, ohne den zu generierenden Befehl tatsächlich auszuführen bar(Sie würden dies tun, wenn Sie das dachten) die änderungen foosollen sich nicht auswirken bar). Das touchDienstprogramm war daher eine eigenständige Version der make -tFunktion.

Gilles 'SO - hör auf böse zu sein'
quelle