2010-02-26 1 views
32

Schnell eins, 2>&1 leitet stderr auf stdout um, aber was bedeutet das kaufmännische Und? Ich weiß, wenn wir hatten 2 > 1 würde es in eine Datei mit dem Namen 1 ausgeben, was macht das kaufmännische Und?Was zeigt das Und-Zeichen in diesem Bash-Befehl an? 1> & 2

+0

Mögliche Duplikat (http://stackoverflow.com/questions/818255/in-the-shell-what -does-21-mean) –

Antwort

16

Es kopiert Dateideskriptor 1 bis Descriptor 2. FD2 Datei ist stderr und FD1 ist stdout, so macht es Alle Ausgaben an stderr gehen stattdessen nach stdout.

+1

Danke, also die & bedeutet Ausgabe an Datei-Descriptor anstelle von Datei – mikip

+1

Es macht Manipulation der Dateideskriptoren. –

55

2>&1 leitet Standardfehler (Dateihandle 2) auf die gleiche Datei um, die Standardausgabe (Dateihandle 1) ist derzeit gehen zu.

Es ist auch eine positionsabhängige Sache so:

prog >x 2>&1 >y 

tatsächlich Standardfehler auf x und Standardausgabe y senden wie folgt:

  • Connect Standardausgabe x;
  • Dann verbinden Standard-Fehler zu gleichen als aktuelle Standard-Ausgabe, die x ist;
  • Dann Standardausgang an y anschließen;
+2

Ich hätte das mehrmals verbessert, wenn ich könnte. Ich habe das rätselhaft gemacht und Ihre Erklärung über die Bedeutung von * order * ist klarer als die aktuelle Bash-Dokumentation: http://www.gnu.org/software/bash/manual/bashref.html#Redirections. Vielen Dank! – FMc

+1

Das fasst alles zusammen! In meinen 8 Jahren, in denen ich Linux benutzt habe, hat niemand dieses Ding so klar erklärt! Danke Kumpel. –

6

Von info bash:

3.6.7 Duplicating File Descriptors 
---------------------------------- 

The redirection operator 
    [N]<&WORD 
    is used to duplicate input file descriptors. If WORD expands to one 
or more digits, the file descriptor denoted by N is made to be a copy 
of that file descriptor. If the digits in WORD do not specify a file 
descriptor open for input, a redirection error occurs. If WORD 
evaluates to `-', file descriptor N is closed. If N is not specified, 
the standard input (file descriptor 0) is used. 

    The operator 
    [N]>&WORD 
    is used similarly to duplicate output file descriptors. If N is not 
specified, the standard output (file descriptor 1) is used. If the 
digits in WORD do not specify a file descriptor open for output, a 
redirection error occurs. As a special case, if N is omitted, and WORD 
does not expand to one or more digits, the standard output and standard 
error are redirected as described previously. 

So 2>&1 Duplikate fd 1 auf fd 2.

16

Das kaufmännische Und gehört zur "1", also hat das Schnipsel wirklich drei Teile: "2", ">", "& 1". Sie bedeuten jeweils "nehmen die Daten aus Ausgabestrom 2 (was Standardfehler ist)", "Redirect it" und das Umleitungsziel, das Ausgabestrom 1 ist. So "&" hier ermöglicht es Ihnen, zu einem vorhandenen Stream umzuleiten , anstatt zu einer Datei.

0

Das Ampersand tut nichts - es ist der Charakter in der 2>&1 Operator, anstatt ein Ding an sich zu sein.

Bash unterstützt mehrere redirection operators, die 2>&1 Operator oder die &>-Operator binden die Ströme des Prozesses vor oder nach der Umleitung.

12

Die & in &1 dupliziert den Dateideskriptor 1. Der duplizierte Deskriptor verhält sich tatsächlich nicht wie eine Kopie, sondern wie ein Alias ​​des alten. Duplizieren 1 ermöglicht mehrere Streams umgeleitet werden zu 1 ohne sich gegenseitig zu überschreiben.

Beispiel: (keine &)

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp 
existing-file 
nt-file: No such file or directory 

Beachten Sie, dass 1 überschreibt, was 2 schrieb.Aber nicht, wenn wir verwenden &:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp 
ls: non-existent-file: No such file or directory 
existing-file 

ein Dateideskriptor ist ein Handgriff in eine Datei (oder einer anderen Eingabe/Ausgabe-Betriebsmittel, wie beispielsweise ein Rohr oder eine Netzwerk-Socket). Wenn 1 und 2 separat zu tmp (wie im ersten Beispiel) umgeleitet werden, verschieben sie ihren tmp Dateizeiger unabhängig voneinander. Deshalb haben sich die Dateideskriptoren gegenseitig überschrieben.

Nach den Linux man page:

[Duplicate File-Deskriptoren] beziehen sich auf die gleiche offene Dateibeschreibung und damit Share-Datei-Offset und Dateistatusflags; Wenn beispielsweise der Dateioffset mit lseek (2) auf einem der Deskriptoren geändert wird, wird auch der Offset für den anderen geändert.

Beachten Sie, dass obwohl & wirkt wie ein Alias, 2>&1 Mittel 2 zum Strom umleiten dass 1 in derzeit zeigt auf. Wenn 1 zu etwas anderem umgeleitet wird, zeigt 2 auf die gleiche Datei, unabhängig von 1.

beachten: [? In der Shell was bedeutet "2> & 1" bedeuten]

$ ls existing-file non-existent-file > tmp 2>&1 > tmp1 
$ cat tmp1 
existing-file 
$ cat tmp 
ls: non-existent-file: No such file or directory