Ich habe versucht, rev
eine Datei zu erstellen und sie dann weiterzuleiten, cat > same_file
aber sie wurde zu einer leeren Datei.
Während ich es versuchte rev file.txt | cat > file2.txt && mv file.txt file2.txt;
, funktionierte es.
Hat sogar rev file.txt | cat >> file.txt;
funktioniert.
Aber als ich es versuchte rev file.txt | cat > file.txt
, schlug es fehl.
command-line
redirect
Vintux
quelle
quelle
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.Antworten:
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:
Was in der "Zeitlupenerklärung" tatsächlich passiert, ist:
rev
bereitet sich darauf vor, den Inhalt von umzukehrenfile.txt
und an Pipe zu sendenrev
die Informationen an Pipe gesendet werden, werden sie von Pipe direkt an Pipe übertragencat
.cat
Empfang der Informationen werden diese automatisch auf die Informationen angewendet, mit denenfile.txt
sie festgelegt wurden.cat
Ich werde nicht darauf wartenrev
, 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 hergestelltfile.txt
.file.txt
während auf die neuen Informationen gewartet wird. Mit >> würde eine Verbindung mit geöffnetfile.txt
und auf neue Informationen in der zuletzt erkannten Zeile gewartet.file.txt
mit > gelöscht wurden ,rev
würde ich versuchen, ihre Arbeit zu erledigen und nichts zu bekommen, dacat
alles gelöscht wurde, um die neuen Informationen vorzubereiten.Warum arbeiten die anderen nach dem Lesen der obigen Informationen? Deswegen:
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 identischfile2.txt
. Danach überschreiben Sie buchstäblich das Ganzefile2.txt
mitfile.txt
, sodass der gesamte Prozess voncat
gelöscht wurde. Grundsätzlich könnte die ganze Zeile vereinfacht werden,cp file.txt file2.txt
weil sie das Gleiche tut, da siefile2.txt
am Ende das verliertrev
und mit demmv
Befehl überschrieben wird .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.
quelle
rev file.txt | cat --bogus-option > file.txt
Außerdem wird die Datei abgeschnitten, obwohl cat nicht versucht, sie zu öffnen.moreutils
), einschließlichsponge
eines Tools, das speziell für den Fall des Überschreibens einer Eingabedatei entwickelt wurde. Zum Beispielrev file.txt >file2.txt && mv file2.txt file.txt
würde die Problemumgehung werdenrev file.txt | sponge file.txt
, was auch dann korrekt funktioniert, wenn bereits etwas benannt istfile2.txt
.Wenn die Shell eine Umleitung sieht, öffnet sie zuerst die relevanten Dateien, bevor sie einen der beteiligten Befehle ausführt. Wenn Sie also Folgendes tun:
Die Umleitung zu
file.txt
bewirkt , dass es vor demfoo
Ausführen abgeschnitten wird und gelesen werden kannfile.txt
. Nebenbei bemerkt, dies ist der Grund, warum Sie nicht tun können:Und warum
sed
hat eine direkte Bearbeitungsoption.Zuletzt tun:
ist eine nutzlose Verwendung von Katze , insbesondere wenn Sie versuchen, von
file.txt
früher zu lesen .Wenn Sie eine Datei direkt umkehren möchten, gibt es keine Verknüpfungen . Möglicherweise können Sie die
sed
oderawk
Tricks bei der direkten Bearbeitung verwenden.quelle
>
ist ein Redirector (Operator), der die Ausgabe an etwas anderes sendet(Eingabe des nächsten Befehls, Drucker ..)
In Ihrem Fall wird die Ausgabe in eine Datei verschoben
file.txt
. Wenn diese Datei bereits vorhanden ist, wird sie überschrieben, wenn sie nicht erstellt wird.>>
ist ein Append-Operator. Wennfile.txt
bereits vorhanden, wird die Ausgabe an das Ende der Datei angehängt. Wenn die Datei nicht vorhanden ist, wird sie erstellt und die Ausgabe in die neue Datei geschrieben, genau wie>
(Redirector).quelle
>
und des>>
Operators befindet.Sie können Vim im Ex-Modus verwenden:
%
Wählen Sie alle Zeilen aus!
Führen Sie den Befehl ausx
speichern und schließenquelle