Was ist der Unterschied zwischen der Verwendung von "Touch-Datei" und "> Datei" beim Erstellen einer neuen Datei?

13

Ich bin neu in Linux. Wenn ich mit bash eine neue Datei .gitignore unter dem aktuellen Verzeichnis erstelle, habe ich festgestellt, dass ich Folgendes tun kann:

> .gitignore

oder

touch .gitignore

Es scheint, dass sie das Gleiche tun. Wenn ich im Handbuch touchnachschaue, wird der Zeitstempel für die aktuelle Datei geändert, es gibt jedoch kein Handbuch für >. Kann also jemand erklären, was getan werden kann >, und gibt es in diesem Zusammenhang einen Unterschied bei der Verwendung dieser beiden Befehle? Vielen Dank.

Steve Deng Zishi
quelle
1
Ich bin gespannt, wo Sie gelernt haben, '>' als
Dateigenerator
1
Die Weiterleitung ist im Bash-Handbuch dokumentiert. Geben Sie in der Befehlszeile den Befehl ein man bash. Es ist ein langes Dokument und es wird Tage oder sogar Wochen dauern, bis es gut verstanden ist, aber es lohnt sich, es durchzuarbeiten, wenn Sie Bash gründlich lernen möchten.
Paddy Landau

Antworten:

21

>ist der Shell-Umleitungsoperator. Siehe Was ist der Unterschied zwischen ">" und ">>" im Shell-Befehl? und wann sollte ich <oder <() oder << und> oder> () verwenden? Es wird hauptsächlich verwendet, um die Ausgabe eines Befehls in eine Datei umzuleiten. Wenn die Datei nicht vorhanden ist, wird sie von der Shell erstellt. Wenn es existiert, schneidet die Shell es ab (leert es). Wenn nur > filekein Befehl vorhanden ist, erstellt die Shell eine Datei, aber es wird keine Ausgabe an sie gesendet. Der Nettoeffekt besteht also darin, eine leere Datei zu erstellen oder eine vorhandene Datei zu leeren.

touchist ein externer Befehl, der eine Datei erstellt oder den Zeitstempel aktualisiert, wie Sie bereits wissen. Mit touchgeht der Dateiinhalt nicht verloren, wenn er vorhanden ist, anders als mit >.

Das Verhalten von >hängt von der Shell ab. In bash > foofunktionieren dash und die meisten Shells wie erwartet. In zsh > foofunktioniert das standardmäßig so: cat > foo- zsh wartet darauf, dass Sie eine Eingabe eingeben.

muru
quelle
10
Der entscheidende Punkt hier ist , dass es keinen praktischen Unterschied zwischen >> fileund touch fileaber wenn filenicht vorhanden ist , gibt es einen großen Unterschied zwischen den beiden von ihnen und > file(in , dass die bisherigen Inhalte fileverloren gehen). Dies und das inkonsistente Verhalten von zsh touch fileist das "sicherste" und sollte daher als der richtige Weg, es zu tun, auswendig gelernt werden.
Monty Harder
1

Hier ist ein interessanter Vergleich:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Ergebnis:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
quelle
1
Der Vergleich mag zwar interessant sein, aber ich sehe nicht wirklich, was ich hier sehen soll. Kannst du erklären, was du vorhast? Ich denke, es gibt verschiedene Möglichkeiten, Dinge in Dateien zu schreiben, aber ich finde das etwas verwirrend. Könnte aber mein Mangel an Kaffee sein.
m00am
@ m00am was hier gezeigt wird, sind effektiv 8 verschiedene Möglichkeiten, eine Datei zu erstellen. stracesoll die ausgeführten Systemaufrufe und die > file.txtMethode die geringste Anzahl ausgeführter Systemaufrufe anzeigen, was eigentlich nicht allzu überraschend ist - je komplexer ein Tool ist, desto komplexer sind seine Systemaufrufe. Das Problem mit den gezeigten Beispielen ist jedoch, dass standardmäßig stracezum stderrStreamen geschrieben wird. In dieser Antwort verwendet Steven die Pipe nur zum Lesen. stderr||&
Daher
Und unter Ubuntu 16.04 |&bekomme ich, wie bei @Serg erwähnt, ungefähr ein Fünftel der hier angegebenen viWerte ... mit Ausnahme des Falls, bei dem ich ungefähr den gleichen Wert
erhalte
WSL? Woah ... Ich hätte nicht gedacht, dass die WSL so viele Systemaufrufe für das hinzufügt , was sie tut.
muru
@muru Cygwin - WSL ist noch nicht fertig stackoverflow.com/a/40370009
Steven Penny