Warum zieht man beim Erstellen einer leeren Datei möglicherweise 'Touch-Datei' vor ': >> Datei'?

33

Nie realisiert, dass Sie dies bis jetzt tun können:

: >> file

Es scheint funktional ähnlich zu sein wie:

touch file

Gibt es einen Grund, warum die meisten Ressourcen diese eingebaute Shell zu bevorzugen scheinen?

Harold Fischer
quelle
7
Die Kurzform kann Shell-bezogen sein, während Touch ein eigenständiger Befehl ist. Daher hängt die Kurzform davon ab, welche Shell Sie verwenden (und die Leute haben starke Präferenzen in diesem Bereich), da möglicherweise nicht alle von ihnen die Abkürzung bereitstellen. touchStandalone zu sein wird genauso funktionieren, was auch immer Sie verwenden sollten.
Patrick Mevzek
6
Das erste Beispiel sollte auf : >> fileoder sogar bearbeitet werden >> file, damit sie den gleichen Effekt haben, dh NICHT den Inhalt der Datei zerstören.
User000001
2
touchaktualisiert in erster Linie die mtime. Es leert nicht anders als eine vorhandene Datei >.
Rexkogitans
2
Keiner der Befehle "Erstellt eine leere Datei"; Sie haben dieses Ergebnis nur, wenn die Datei noch nicht existiert. Um eine leere Datei zu garantieren, benötigen Sie > file.
Alexis

Antworten:

47

Sie müssen nicht einmal verwenden :; Sie können nur > file(zumindest in bash; andere Muscheln können sich anders verhalten).

In der Praxis gibt es hier keinen wirklichen Unterschied (obwohl der winzige Aufwand für das Aufrufen /bin/toucheine Sache ist).

touchSie können jedoch auch die Zeitstempel einer bereits vorhandenen Datei ändern, ohne den Inhalt zu ändern oder zu löschen. ferner > filewird alles file, was bereits existiert, ausgeblasen. Dies kann umgangen werden, indem stattdessen verwendet wird >> file.

Ein weiterer Unterschied touchbesteht darin, dass Sie mehrere Dateien gleichzeitig erstellen (oder den Zeitstempel aktualisieren) können (z. B. touch foo bar baz quux), wobei die Syntax prägnanter ist als bei der Umleitung, bei der jede Datei eine eigene Umleitung benötigt (z >foo >bar >baz >quux. B. ).

Verwenden von touch:

$ touch foo; stat -x foo; sleep 2; touch foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:19 2018
Modify: Fri May 25 10:55:19 2018
Change: Fri May 25 10:55:19 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:55:21 2018
Change: Fri May 25 10:55:21 2018

Umleitung verwenden:

$ > foo; stat -x foo; sleep 2; >> foo; stat -x foo
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
  File: "foo"
  Size: 0            FileType: Regular File
  Mode: (0644/-rw-r--r--)         Uid: (991148597/redacted)  Gid: (1640268302/redacted)
Device: 1,5   Inode: 8597208698    Links: 1
Access: Fri May 25 10:55:21 2018
Modify: Fri May 25 10:56:25 2018
Change: Fri May 25 10:56:25 2018
DopeGhoti
quelle
6
Es scheint, als würde >> filedie Änderungszeit nicht aktualisiert. Nicht das, wonach OP sucht, sondern nur darauf hinweisen wollte, dass es keine vollständige Alternative zum Anfassen zu sein scheint.
Jesse_b
2
Da die Frage keine bestimmte Shell angibt. Es könnte gut sein, darauf hinzuweisen, dass > filein zsh gleichbedeutend mit cat > file, nicht : > file.
JoL
Auch tcsh erlaubt : > file, aber irrt weiter > file. Vielleicht ist die Äquivalenz von > fileto : > fileauf die Bourne-Shell und die Bash beschränkt?
JoL
+1 für Gründlichkeit, beachten Sie jedoch, dass Sie auf mehreren Mainstream-Shells (ich würde sogar alle oder die meisten Shells erraten, da die einfachste Implementierung dies natürlich als Nebeneffekt hervorrufen würde) mehrere Dateien mithilfe der Shell-Umleitung berühren können: : >foo >baroder : >>foo >>barwerden berühren Sie beide foound bar.
mtraceur
Nur um wegen des Zusammenhangs der eigentlichen Frage hier pedantisch zu sein, : >foo >barwerden touchdie Akten aber nicht ; es wird die (null) Ausgabe der Umleitung : in die Dateien. touchwürde die Dateien berühren. (:
DopeGhoti
32

Denn Sie können touchmehrere Dateien auf einmal erstellen, ohne zusätzliche Sonderzeichen eingeben zu müssen. Dazu gehören Dinge wie die Klammererweiterung, z touch file{1,2,3,4}.

Ein weiteres Problem ist, dass es beim Schreiben eines Tutorials wichtig ist, zu wissen, dass Ihre Leser mit dem Thema wahrscheinlich nicht gut vertraut sind. Ein einfacher Befehl kann viel verständlicher sein als eine komisch aussehende Kombination von Nicht-Buchstaben-Zeichen. Ich würde erwarten, dass es eine Reihe von gelegentlichen Shell-Benutzern gibt, die nicht wissen, was es :ist, aus dem einfachen Grund, dass es nicht wirklich etwas tut . Ähnliches gilt für eine Ebene > fooohne Befehl: Auch wenn Sie wissen, was eine Umleitung ist, ist eine Umleitung ohne Quelle möglicherweise nicht intuitiv.

Außerdem schreiben wir hier auf unix.se häufig Befehlsbeispiele mit einem führenden Dollarzeichen, um die Eingabeaufforderung anzuzeigen. Sonderzeichen am Zeilenanfang könnten damit verwechselt werden. (Beachten Sie, dass es Systeme und Shells gibt, die >als Teil der Standardeingabeaufforderung verwendet werden.)

ilkkachu
quelle
4
Und wenn der Befehl nicht vollständig verstanden wird, gibt es immer "Menschenberührung". Ich bezweifle, dass "man:> file" irgendetwas Nützliches zurückgeben würde :-) Auch WRT-Eingabeaufforderungen, einige (vielleicht die meisten) erlauben es Ihnen, die Eingabeaufforderung so einzustellen, dass sie beliebig ist. Meins zeigt den Systemnamen (da ich viele entfernte xterms verwende) und das aktuelle Verzeichnis an und ist für verschiedene Systeme auf unterschiedliche Farben eingestellt.
Jamesqf
1
@ Jamesqf, yep. Jetzt gibt es natürlich auch help :oder was auch immer Ihre Shell für die Dokumentation hat. Dies setzt jedoch :voraus, dass Sie den Befehl selbst erkennen, sich daran erinnern, dass nicht alles über eine Manpage verfügt, und schließlich :in der Dokumentation nachschlagen können . Der letzte Teil kann ziemlich schwierig sein. : D
ilkkachu
@jamesqf, und ja, ich meinte hauptsächlich das letzte Zeichen der Standardeingabeaufforderung.
Ilkkachu
1
+1 für das Hervorheben der Aspekte Intuition und Nicht-ein-obskures-Konstrukt.
mtraceur
@ilkkachu: Ja. Doppelpunkte in der Dokumentation zu finden ist nicht so schwierig: Die Suche nach einem
Punkt
18

Nun, für mich ist der Hauptgrund die Lesbarkeit. Wenn touch fileSie wissen, was los ist, weiß auch jemand, der noch nicht mit Shell-Skripten vertraut ist, was los ist. Und wenn nicht, ist es einfach, dies zu tun man touchund zu sehen:

A FILE argument that does not exist is created empty

Bei den kryptischen Dingen wie :und >ist es schwieriger zu wissen, was los ist, und da es keinen wirklichen Vorteil gibt, besteht keine Notwendigkeit, dies zu verwenden.

yo '
quelle
6

Stellen Sie sich vor, Sie suchen nach einem Ihrer alten Shell-Skripte, von denen Sie sich nur erinnern, dass eine Markierungsdatei in / tmp erstellt wird. Es ist einfach, alle Ihre * .sh-Dateien nach dem Wort "touch" zu durchsuchen. Wenn Sie nicht genau wissen, nach welchem ​​Dateinamen Sie suchen sollen, erhalten Sie viele False Positives, wenn Sie stattdessen nach einem Doppelpunkt suchen.

B von C
quelle