2012-04-17 19 views
7

Ich stieß vor kurzem auf einen Shell-Befehl, der wie folgt aussah: "> outfile < infile cat", die funktional äquivalent zu "cat infile> outfile" zu sein scheint. In diesem Fall scheint die allgemeine Form "> outfile < infile command arg1 ... argN" wird "command arg1 ... argN infile> outfile".Shell-Befehl Starten mit ">"

Wie auch immer, ich fragte mich, ob irgendjemand näher ausführen könnte, wie der führende ">" diesen Effekt erreicht, und ob es irgendwelche praktischen Anwendungen dafür gibt.

+0

Warum wurde das abgelehnt? Es ist eine gute Frage. – Aatch

Antwort

6

Die "Bash Reference Manual" sagt folgendes über die Umleitung Operatoren:

Folgende Umleitungsoperatoren können überall in einem einfachen Befehl vor oder erscheinen oder einen Befehl folgen.

So sind die folgenden Befehle sind alle gleichwertig:

ls -al > listing.txt 
> listing.txt ls -al 
ls > listing.txt -al 

Obwohl ich denke, würde, dass die erste häufigste Form ist.

Beachten Sie, dass die relative um von Umleitungen signifikant ist, also, wenn Sie einen Dateideskriptor zu einem anderen umleiten, würde zum Beispiel die folgenden unterschiedlich sein:

ls > listing.txt 2>&1 # both stdout and stderr go in to listing.txt 

ls 2>&1 > listing.txt # only stdout goes to listing.txt, because stderr was made 
         # a copy of stdout before the redirection of stdout 
4

Das ">" leitet einfach die Ausgabe des Befehls in die Datei um, die als nächstes Argument angegeben wird. Die typische Verwendung besteht darin, dies am Ende des Befehls anzuhängen, aber es kann an beliebiger Stelle sein. Also:

> outfile <command> entspricht <command> > outfile. Gleiches gilt für die Eingabeumleitung.

Bitte beachten Sie, dass in den obigen Beispielen <command> keine seltsame Syntax ist - es ersetzt einfach einen beliebigen Befehl.

+0

Sie sollten wahrscheinlich keine spitzen Klammern um Ihren mythischen "Befehl" verwenden - es macht das Beispiel etwas verwirrend. –

+0

@MichaelBurr yeap Ich dachte daran, aber konnte nicht mit einem besseren Format kommen. –

+1

'> OUTFILE COMMAND','>% outfile%% command% ','> $ outfile $ command' – user123444555621

1

Das entspricht nicht:

cat infile > outfile 

Vielmehr ist es

cat <infile> outfile 

(das nur für den Fall der Katze, cat infile gleiche ist wie cat <infile)

Sobald Sie es sehen, dass So scheint der ursprüngliche Befehl einfacher zu sein.

0

Ein führendes Größer-als-Zeichen (>) wird zum Umleiten der Ausgabe verwendet. Standardmäßig wird STDOUT umgeleitet. In diesem Fall ist STDOUT leer und somit wird eine neue und leere Datei erstellt (ähnlicher Effekt wie touch output).

Sie können auch diese Art von Befehl zu leeren vorhandenen Dateien verwenden, das heißt

$ echo FOO >/tmp/foo 
    $ ls -l /tmp/foo 
    -rw-r--r-- 1 flah wheel 4 Apr 17 01:49 /tmp/foo 
    $ > /tmp/foo 
    $ ls -l /tmp/foo 
    -rw-r--r-- 1 flah wheel 0 Apr 17 01:49 /tmp/foo 
    $ 

Für weitere Informationen die Redirection Abschnitt der bash man-Seite sehen.

1

Eine Anmerkung.Es ist, weil Sie tatsächlich schreiben

< file command 

es die nutzlosen Einsatz von Cat umso mehr unverzeihlich macht:

cat file | command 

Das heißt, selbst wenn aus irgendeinem Grund wollen Sie die Datei syntaktisch zu der sein links vom Befehl brauchen Sie immer noch nicht cat!