Was macht ">> file command" und wie unterscheidet es sich von "command >> file"?

793
Greenonline

Aus diesem hoch gewählten Kommentar zu Was bedeutet ">>" im Terminalbefehl? :

"Programm vorher" Was bedeutet das? Befehl natürlich, aber Umleitungen können auch vorangestellt werden, dh>> file command

Ich kann mich nicht erinnern, einen solchen Fall gesehen zu haben - obwohl es angesichts der Menge an Upvotes eindeutig existiert. Ich habe immer nur Umleitungsbefehle des Formats gesehen und verwendet

command >> file 

bei der Verwendung >>und seinesgleichen (dh 2>, 2>&1usw.).

Wann und warum sollten Sie die Bestellung umkehren? Bedeutet das, dass alles stdoutumgeleitet wird, nicht nur das von command? Hat jemand konkrete Beispiele?

Ich hatte ein Google und konnte sofort Beispiele finden.

6

2 Antworten auf die Frage

6
Kamil Maciorowski

>> file command
Bedeutet das, dass alles stdoutumgeleitet wird, nicht nur das vom Kommando aus?

Eine solche Umleitung betrifft einen einfachen Befehl. Von man 1 bash:

Bevor ein Befehl ausgeführt wird, können seine Eingabe und Ausgabe mithilfe einer speziellen Schreibweise umgeleitet werden, die von der Shell interpretiert wird. […] Die folgenden Umleitungsoperatoren können irgendwo in einem einfachen Befehl vorkommen oder erscheinen oder einem Befehl folgen. Umleitungen werden in der Reihenfolge von links nach rechts abgearbeitet.

„Die folgende Umleitungsoperatoren“ sind [n]<word, [n]>word, [n]>>wordusw.

Ein einfacher Befehl ist eine Folge optionaler Variablenzuweisungen, gefolgt von durch Leerzeichen getrennten Wörtern und Umleitungen, die von einem Steuerelementoperator beendet werden.

Und

Steueroperator
Ein Token, das eine Steuerfunktion ausführt. Es ist eines der folgenden Symbole:
|| & && ; ;; ( ) | |&<Newline>

Dies bedeutet, dass die folgenden Befehle gleichwertig sind:

echo Some text >> file echo Some >> file text echo >> file Some text >> file echo Some text 

Die Frage ist mit getaggt und ich zitiere, man 1 bashaber die obigen Befehle funktionieren shauch.

Der Befehlszeilen-Parser muss alle Umleitungen "bedienen", bevor er den Befehl ausführt (dh der Befehl, der diese Umleitungen entfernt hat). Denken Sie darüber nach, der Vorgang ist derselbe, unabhängig davon, wo sich die jeweilige Umleitung befindet. Es gibt keinen Grund, es am Ende zu fordern.


Wann und warum sollten Sie die Bestellung umkehren?

Ich kann mich nicht an eine Situation erinnern, in der ich eine Umleitung in der Mitte haben wollte. Es gibt jedoch einen Anwendungsfall, bei dem eine Eingabeumleitung am Anfang sehr nützlich ist. Betrachten Sie diesen Code:

grep foo file | tail | … 

Stellen Sie sich vor, die Pfeife ist sehr lang. Es ist auf Super User gepostet und löst einige Probleme. Sie können es in Ihre Konsole einfügen und ausführen. Was ist, wenn Sie es lieber an einen Befehl oder eine Pipe anhängen möchten ? ZB möchten Sie erhalten:

my_custom_command | grep foo | tail | … # ^^^^^^^^^^^^^^^^^^^ this is the part you'd be happy to paste 

Sie müssen fileaus dem kopierten Befehl entfernen . Aus diesem Grund bevorzugen einige Benutzer Befehle wie diese:

cat file | grep foo | tail | … # ^^^^^^^^^^^^^^^^^^^ it's easy to copy this # ^^^^^^^^^^^^^^^^^^^^^ or even this 

In anderen Fällen wäre dies völlig nutzlos cat. Einige würden sagen, dass es immer noch ist, ungeachtet der Umstände. Wie wäre es mit:

< file grep foo | tail | … # ^^^^^^^^^^^^^^^^^^^ it's easy to copy this 

Nein cat und eine bequeme Form!

Beachten Sie, dass unter Windows `echo Some text> file` und`> file echo Some text` andere Ergebnisse liefert phuclv vor 5 Jahren 0
3
baelx

Erläuterung

Um zu verstehen, wie E / A-Umleitungsoperatoren funktionieren, müssen Sie daran denken, dass Sie in einer Shell arbeiten, die ständig mit STDOUT oder mit STDERR (hauptsächlich) mit jedem Befehl druckt, den Sie eingeben.

>>Es ist mir egal, wie die Ausgabe geschieht, aber nur wenn sie passiert, kann sie an die Datei angehängt werden, die direkt auf sie folgt. Beachten Sie auch, dass Umleitungsoperatoren nicht in Ihre Befehle einbezogen werden. Sie können die Dinge weiter testen, indem Sie tippen, echo hello >> newfile this is my outputund wenn Sie cat newfileFolgendes sehen: "Hallo, das ist meine Ausgabe".

In diesem speziellen Fall muss die Reihenfolge der Befehle in Kombination mit dem Append-Operator (>>) nicht unbedingt beachtet werden. Beobachten Sie stattdessen das Ergebnis Ihrer Befehle, wie es Kamils ​​Kommentar oben entgeht. Solange etwas, das kein Fehler ist, in Ihrer Shell gedruckt wird, >>kann es sein.

Der Befehl des Echos besteht darin, auf die Standardausgabe (STDOUT) zu drucken. Probieren Sie es aus und Sie sehen eine neue Zeile mit Ihrer Ausgabe. Wenn Sie >> fileden Mix einbeziehen, wird alles, was in diesem Zeilenvorschub erscheint, in diese Datei eingefügt. Die Reihenfolge davon ist jedoch wichtig. Die anzuhängende Datei muss dem Operator direkt folgen.

Hinweis zu den Beispielen

In Bezug auf konkrete Beispiele würde ich sagen, dass Sie nicht viele davon finden werden, da das Umschalten der Reihenfolge als weniger intuitiv / lesbar angesehen wird als ein paar Pfeile, die von einer Quelle zur anderen zeigen. Wenn Sie ausführliche Shell-Skripts schreiben, ist der Bedarf an intuitivem und lesbarem Code noch größer.


Wenn Sie dies noch tiefer verstehen möchten, können Sie sich mit den Dateideskriptoren (STDIN, STDOUT, STDERR) und der Funktionsweise von Unix- Systemen vertraut machen . Dies alles kann als Fenster zur Unix-Systemprogrammierung betrachtet werden und wie Unix / Linux auf einer tieferen Ebene funktioniert.