Das Grundlegende, was Sie in diesem Fall zwischen beiden Umleitungsarten (> und >>) verstehen müssen, ist:
>
Leitet die Informationen um und überschreibt sie, auf die sie verwiesen wurden. Dies geschieht beim Empfang von Informationen über die Pipe "|"
>>
Leitet die Informationen, auf die verwiesen wurde, um und verkettet sie. Dies geschieht beim Empfang von Informationen über die Pipe "|"
In beiden Fällen wird die Datei stattdessen erstellt, wenn sie nicht vorhanden ist. Nur bei ">>" werden die Informationen verkettet, wenn Sie sie erneut in derselben Datei ausführen. Mit ">" würden Sie einfach alles überschreiben, was Sie beim ersten Durchlauf getan haben.
Aber hier ist der Deal, wenn Sie dieselbe Eingabedatei wie die Ausgabedatei verwenden. In diesem speziellen Fall würden Sie, wenn Sie ">" verwenden, die Informationen entfernen, die der "Eingabe" -Teil analysieren muss, da die Ausgabedatei sie "überschreiben" würde. Also in:
rev file.txt | cat > file.txt
Was in der "Zeitlupenerklärung" tatsächlich passiert, ist:
rev
bereitet sich darauf vor, den Inhalt von umzukehren file.txt
und an Pipe zu senden
- Während
rev
die Informationen an Pipe gesendet werden, werden sie von Pipe direkt an Pipe übertragen cat
.
- Während der
cat
Empfang der Informationen werden diese automatisch auf die Informationen angewendet, mit denen file.txt
sie festgelegt wurden.
- Das Schlüsselwort hier ist "während", weil alles zur gleichen Zeit geschieht. Bitte beachten Sie die hervorragenden Kommentare von Emil, um ein tieferes Verständnis für diesen Teil zu erhalten.
cat
Ich werde nicht darauf warten rev
, die gesamte Datei weiterzuleiten. Es beginnt einfach in der Minute, in der der erste Teil der Informationen eingeht. Je nachdem, welches Symbol Sie verwendet haben, wird eine Verbindung zu hergestellt file.txt
.
- In diesem Fall schneidet die Shell die Ausgabedatei ab, da Sie > anstelle von >> verwendet haben. Dies bedeutet , dass die Informationen geöffnet und gelöscht werden,
file.txt
während auf die neuen Informationen gewartet wird. Mit >> würde eine Verbindung mit geöffnet file.txt
und auf neue Informationen in der zuletzt erkannten Zeile gewartet.
- Da die Informationen bereits
file.txt
mit > gelöscht wurden , rev
würde ich versuchen, ihre Arbeit zu erledigen und nichts zu bekommen, da cat
alles gelöscht wurde, um die neuen Informationen vorzubereiten.
Warum arbeiten die anderen nach dem Lesen der obigen Informationen? Deswegen:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Hier leiten Sie an cat weiter, die die Informationen an eine andere Datei sendet . In diesem Fall ist die verarbeitete Eingabedatei file.txt
nicht mit der Ausgabedatei identisch file2.txt
. Danach überschreiben Sie buchstäblich das Ganze file2.txt
mit file.txt
, sodass der gesamte Prozess von cat
gelöscht wurde. Grundsätzlich könnte die ganze Zeile vereinfacht werden, cp file.txt file2.txt
weil sie das Gleiche tut, da sie file2.txt
am Ende das verliert rev
und mit dem mv
Befehl überschrieben wird .
rev file.txt | cat >> file.txt
In diesem Fall verketten Sie die Informationen mit derselben Datei. Es wird also nur eine Verbindung zu dieser Datei hergestellt, aber nicht die Informationen gelöscht, wie sie mit einem einzigen > angezeigt werden . Das Endergebnis sollte die ursprüngliche Information plus die umgekehrte Information sein.
cat
:rev file.txt > file2.txt && mv file2.txt file.txt
. Dies ist eine überflüssige Verwendung voncat
. Wenn Sie es weglassen, sparen Sie sich das Laichen eines zusätzlichen Prozesses.