Gebrauch von Berührung und vi?


55

Gibt es einen Vorteil beim Erstellen einer Datei mit Touch vor dem Bearbeiten .. wie:

touch foo
vi foo

im Gegensatz dazu, es sofort zum Editor zu bringen? Mögen:

vi foo

Ich sehe ziemlich viele Tutorials, die das erstere ( touchdamals vi) verwenden.

Antworten:


111

touchDurch das erstmalige Überprüfen der Datei wird bestätigt, dass Sie tatsächlich in der Lage sind, die Datei zu erstellen, anstatt Zeit in einem Editor zu verschwenden, um festzustellen, ob das Dateisystem schreibgeschützt ist oder ein anderes Problem vorliegt.


6
Und touchermöglicht es Ihnen, dies chmod +xvor dem Bearbeiten nachträglich zu tun. Dies ist sinnvoll, wenn Sie ein #!/bin/bashShell-Skript schreiben .
Aaron McDaid

11
Alternativ können Sie aber auch gleich :wnach dem Start das erste tun vi. (und :chmod +x %wenn Sie es ausführbar machen möchten)
Stéphane Chazelas

26
touchkann jedoch fehlschlagen vi, :w!wenn dies erfolgreich gewesen wäre (z. B. wenn filevorhanden, Sie jedoch nicht der Eigentümer sind und keinen Schreibzugriff darauf haben, während Sie Schreibzugriff auf das aktuelle Verzeichnis haben). Im Gegensatz dazu touchkann erfolgreich sein , aber vi‚s :woder :w!kann fehlschlagen , wenn Sie Eigentümer der Datei sind, aber keinen Schreibzugriff darauf haben , noch in das aktuelle Verzeichnis (würden Sie in der Lage sein , um es mit zu arbeiten :!chmod +w %(einige viwie Implementierungen vimtun können das automatisch auf :w!)).
Stéphane Chazelas

macht jetzt viel sinn!
Fawix

4
Vim / VI ganz klar zu sagen , wenn Sie eine Datei öffnen , die Sie nicht berechtigt, zu schreiben: "foo" [readonly]. Und noch einmal beim Warning: Changing a readonly file.
Aufrufen des

25

Abgesehen von den angegebenen Antworten besteht ein Vorteil von touch darin, dass alle anderen Benutzer / Terminals, die dieselbe Datei bearbeiten, während Sie sie berühren, eine Warnung erhalten, wenn sie versuchen, Änderungen zu speichern.

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

Dies würde sie warnen, obwohl Sie keine Änderungen per se vorgenommen und nur die Datei berührt haben.


Dies ist ein guter Punkt, um herauszufinden, ob Benutzer dieselbe Datei verwenden / bearbeiten, und sie gleichzeitig zu warnen. Ich sehe einen klaren Vorteil davon in einer Umgebung mit mehreren Mandanten!
Fawix

@Fawix dann solltest du diese Antwort aktualisieren Aswell
Kiwy

19

Abgesehen von der akzeptierten Antwort:

Es ist erwähnenswert, dass touchzum Aktualisieren von Dateizeitstempeln verwendet wird. Wenn Sie toucheine vorhandene Datei verwenden, wird der Zeitstempel der Datei auf das aktuelle Datum und die aktuelle Uhrzeit aktualisiert. Wenn die Datei nicht vorhanden ist, wird eine leere Datei mit dem aktuellen Datum und der Uhrzeit als Zeitstempel erstellt.

viDagegen wird keine neue Datei erstellt, es sei denn, Sie schreiben darauf.

Wenn ich zum Beispiel tippte vi test.txt, einige Notizen tippte und dann tippte :q!; test.txtwürde nicht existieren.


Was ist mit dem in der akzeptierten Antwort beschriebenen Vorteil?
JBentley

8

Ohne touchwird es keine neue Datei geben, bis Sie vizum Schreiben auffordern.

Stellen Sie sich ein Mehrbenutzersystem vor (möglicherweise befinden Sie sich in einem im Netzwerk eingebauten Dateisystem, das von vielen Systemen mit jeweils vielen Benutzern gemeinsam genutzt wird). Das Ausführen stellt touchsicher, dass Sie die Datei haben (und dass Sie darauf schreiben können) und aktualisiert sogar den Zeitstempel. Ein anderer Benutzer, der eine solche Datei erstellen möchte, erkennt, dass Sie Eigentümer dieser Datei sind. Wenn es bereits vorhanden ist und ein anderer Benutzer es löschen oder ersetzen möchte, stellt er fest, dass es kürzlich geändert wurde, und überlegt es sich möglicherweise zweimal.


4

Es hat keinen Vorteil, touchzuerst zu sein. vierstellt die Datei, wenn sie nicht existiert.

Die akzeptierte Antwort besagt, dass geprüft wird, ob Sie dort schreiben können, bevor Sie Zeit in einem Editor verschwenden. Stimmt, aber jetzt verschwenden Sie touchjedes Mal Zeit beim Tippen . Nicht in der Lage zu sein, irgendwo zu schreiben, ist ziemlich außergewöhnlich im Vergleich zu der Häufigkeit, mit der es funktioniert (solange Sie sich an sudoDateien außerhalb Ihres Home-Verzeichnisses erinnern /tmpoder als root angemeldet sind).

Öffnen Sie einfach den Editor und machen Sie, was Sie wollen, und versuchen Sie dann, die Datei zu speichern. Wenn es auch mit nicht funktioniert, :w!speichern Sie es an einer anderen Stelle ( :w ~/asdf) und beheben Sie das Problem. Sobald es behoben ist, können Sie die Dateiinhalte aus der temporären Datei zum Original kopieren: cat ~/asdf > /mnt/example.txt && rm ~/asdf. Der Grund, den wir catanstelle von mvoder verwenden, cpbesteht darin, die Berechtigungen und andere Attribute des Ziels zu verwenden.

Darüber hinaus können Sie für eine erweiterte Befehlszeilenverwendung den Hintergrund vimit Ctrl+ verwenden, Zwährend Sie das Problem beheben (oder :suspendoder verwenden :sus), und schließlich fgden Befehl write erneut ausführen.

Edit: Beitrag verbessert als Reaktion auf / u / G-Mans Kommentare. Vielen Dank!


3
Hier gibt es einige Sicherheitsprobleme: (1) Wenn die Datei /mnt/example.txtnicht für die Welt lesbar sein soll, Ihre umask jedoch auf einen zulässigen Wert wie 22 festgelegt ist, ist /tmp/asdf sie für die Welt lesbar. Befinden sich andere Personen im System, können diese möglicherweise die temporäre Kopie der Datei lesen. (2) Die Datei /mnt/example.txtist wahrscheinlich nicht für die Welt beschreibbar. Wenn sich jedoch böswillige Personen auf dem System befinden, können diese möglicherweise die temporäre Kopie der Datei lesen und durch eine geänderte Version ersetzen, bevor Sie sie verschieben / kopieren es wieder an den richtigen Ort.   … (Fortsetzung)
G-Man sagt, dass Monica am

3
(Fortsetzung)… (Das Setzen des Sticky-Bits /tmpkann dies verhindern.) (3) Der Befehl mv /tmp/asdf /mnt/example.txtzerstört den Strom vollständig /mnt/example.txtund ersetzt ihn durch /tmp/asdf. Sie möchten den Inhalt von /mnt/example.txtdurch den Inhalt von ersetzen /tmp/asdf. Durch die Verwendung von wird festgelegt mv, dass Sie /mnt/example.txtdieselben Attribute haben wie /tmp/asdf- wahrscheinlich im Besitz von Ihnen und für die Welt lesbar. Es könnte besser sein, cp /tmp/asdf /mnt/example.txtoder sogar cat /tmp/asdf > /mnt/example.txt. … PS (4) Sie können die viEingabe unterbrechen :suspend(oder :suskurz).
G-Man sagt, dass Monica am

@ G-Man Das sind einige gute Punkte. Ich habe keine besondere Angst davor, dass jemand während der 5 Minuten, in /tmpdenen es ist , eine Datei stiehlt , aber es gibt keine Entschuldigung dafür, nicht zu schreiben ~/. Ich hatte auch nicht daran gedacht, dass es die Attribute ersetzen würde. Ich werde meinen Beitrag bearbeiten, danke :)
Luc

3

Es gibt keinen Vorteil. vierstellt eine Datei, wenn sie nicht existiert.


1

vi ist ein visueller Texteditor (vi = visual). Er ist visuell im Vergleich zu "ed", mit dem Sie jeweils nur eine Textzeile sehen und ändern können.

Der touchBefehl aktualisiert den Zeitstempel einer vorhandenen Datei oder erstellt eine neue Datei, wenn die Datei noch nicht vorhanden ist. Es ist gut, um Dinge zu testen, die stark von Zeitstempeln abhängen.

Wenn Ihre Datei eine Textdatei ist oder noch nicht vorhanden ist, hat das Öffnen mit vi und das Ausgeben des Befehls :wqan vi dasselbe Ergebnis wie das Berühren dieser Datei. Nur so sind sich die beiden Befehle überhaupt ähnlich.


1

Speziell für den Einsatz mit vi, gibt es keine Notwendigkeit , die Datei zu erstellen , bevor Sie sie bearbeiten: vikann verwendet werden , um eine neue Datei zu erstellen und zu speichern. Es gibt jedoch aufrufende Kontexte, in denen die Datei vorhanden sein muss. Auf meinem System (OS X) kann ich beispielsweise einen geeigneten GUI-Editor (abhängig vom Dateityp) wie folgt starten:

open foo.txt

Dies würde foo.txtin TextEdit, in Emacs oder in einem anderen Editor geöffnet , den ich als bevorzugten Editor für Textdateien festgelegt habe, und den Prozess abbrechen, sodass ich meine Eingabeaufforderung sofort zurückerhalte. ( open bar.pyMöglicherweise wird es in IDLE, dem Python-Editor usw. geöffnet.) Oder ich kann ausdrücklich Emacs anfordern:

open -a emacs foo.txt

openVoraussetzung ist aber, dass die Datei bereits existiert, sonst wird ein Fehler ausgelöst. Also musste ich emacsals folgende Shell-Funktion definieren , mit der ich schreiben kann emacs foo, um die emacsGUI zu starten, auch wenn foosie nicht vorhanden ist.

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}

0

vi wird verwendet, um eine Datei als Benutzer zu bearbeiten, während touch den Zeitstempel darauf setzen kann und hauptsächlich in Skripten und dergleichen verwendet wird.

Eine andere Möglichkeit zum Erstellen einer Datei ist:

>newfile.txt

1
Dies ist unzuverlässig, da es in der POSIX-Spezifikation nicht (afaik) angegeben ist. Beispiel: In zshist identisch mit cat >newfile.txtund Sie müssen Strg + D drücken.
Adam Katz

@ AdamKatz guter Punkt; Ich habe die Antwort aktualisiert, danke für den Rat.
James Youngman

0

Laut Manpage of Touch besteht seine Hauptaufgabe darin, Datei-Zeitstempel zu ändern.
Ofc erstellt auch die Datei mit dem aktuellen Zeitstempel und dann können Sie die Datei bearbeiten.

VI ist ein Texteditor, der das tut, was er sagt. Text bearbeiten, öffnen, speichern, Datei bearbeiten usw.

Alles ist ein Geschmack von Benutzer und Habbit: Berühren Sie dann vi oder vi file.txt.


0

touch Befehl ändert das Datum und die Uhrzeit einer Datei mit dem aktuellen Zeitstempel.
Wenn die Datei nicht vorhanden ist, wird eine neue Datei mit Datum und Uhrzeit erstellt.

vi Der Editor wird zum Bearbeiten von Dateien verwendet, wenn keine Datei vorhanden ist. Er erstellt eine neue Datei, es sei denn, wir speichern die Datei nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.