3178 Stimmen

Was bedeutet in der Shell "2>&1"?

Wenn ich in einer Unix-Shell Folgendes kombinieren möchte stderr y stdout in die stdout stream für weitere Manipulationen kann ich am Ende meines Befehls folgendes anhängen:

2>&1

Wenn ich also Folgendes verwenden möchte head auf die Ausgabe von g++ kann ich so etwas tun:

g++ lots_of_errors 2>&1 | head

so dass ich nur die ersten paar Fehler sehen kann.

Ich habe immer Schwierigkeiten, mir das zu merken, und muss es immer wieder nachschlagen, vor allem, weil ich die Syntax dieses speziellen Tricks nicht ganz verstehe.

Kann jemand das aufschlüsseln und Zeichen für Zeichen erklären, was 2>&1 bedeutet?

63 Stimmen

@dbr Ich glaube nicht, dass es nur an der Bash liegt - ich glaube, es ist eine Sache der Bourne-Shell; daher sh, bash, ksh, ash, dash, usw.

8 Stimmen

Dies ist Teil des Umleitungsparagraphen, der POSIX-konforme Shells oder kurz POSIX-Shells beschreibt. ksh ist zum Beispiel eine POSIX-Shell. Siehe: pubs.opengroup.org/onlinepubs/009695399/utilities/

19 Stimmen

Dieses Konstrukt funktioniert auch unter Windows.

11voto

ams Punkte 23482

Aus der Sicht eines Programmierers bedeutet dies genau dies:

dup2(1, 2);

Siehe die Manpage .

Verstehen, dass 2>&1 ist eine kopieren. erklärt auch, warum ...

command >file 2>&1

... ist nicht dasselbe wie ...

command 2>&1 >file

Die erste sendet beide Streams an file , während die zweite Fehler an stdout und die normale Ausgabe in file .

9voto

yurenchen Punkte 1234

Eingabe umleiten

Die Umleitung der Eingabe bewirkt, dass die Datei mit dem Namen sich aus der Expansion von word ergibt, zum Lesen auf dem Dateideskriptor n geöffnet wird Deskriptor n oder die Standardeingabe (Dateideskriptor 0), wenn n nicht angegeben ist.

Das allgemeine Format für die Umleitung von Eingaben ist:

[n]<word

Ausgabe umleiten

Die Umleitung der Ausgabe bewirkt, dass die Datei, deren Name sich aus der Expansion von word ergibt, zum Schreiben auf Dateideskriptor n oder die Standardausgabe (Dateideskriptor 1), wenn n nicht angegeben ist. Wenn die Datei nicht existiert, wird sie erstellt; wenn sie vorhanden ist, wird sie auf die Größe Null gekürzt.

Das allgemeine Format für die Umleitung der Ausgabe ist:

[n]>word

Verschieben von Dateideskriptoren

Der Umleitungsoperator,

[n]<&digit-

verschiebt die Dateideskriptor-Ziffer in den Dateideskriptor n, oder die Standardeingabe (Dateideskriptor 0), wenn n nicht angegeben ist. digit wird nach der Duplizierung in n geschlossen.

Ähnlich verhält es sich mit dem Umleitungsoperator

[n]>&digit-

verschiebt die Dateideskriptor-Ziffer auf den Dateideskriptor n, oder die Standardausgabe (Dateideskriptor 1), wenn n nicht angegeben ist.

Ref:

man bash

Typ /^REDIRECT zu lokalisieren, um die redirection Abschnitt, und erfahren Sie mehr...

Eine Online-Version finden Sie hier: 3.6 Umleitungen

PS:

Die meiste Zeit, man war das leistungsfähige Werkzeug zum Erlernen von Linux.

9voto

tim-montague Punkte 13518

unix_commands 2>&1

Damit werden Fehler auf dem Terminal ausgegeben.

Im Folgenden wird das Verfahren erläutert

  • Wenn Fehler auftreten, werden sie in den Standardspeicher für Fehler geschrieben &2 "Puffer", aus dem der Standardfehlerstrom 2 Referenzen.
  • Wenn die Ausgabe erfolgt, wird sie an die Adresse des Standardausgabespeichers geschrieben &1 "Puffer", aus dem der Standardausgabestrom 1 Referenzen.

Nehmen Sie also die unix_commands Standardfehlerstrom 2 und umleiten > den Strom (der Fehler) an die Speicheradresse der Standardausgabe &1 so dass sie an das Terminal weitergeleitet und ausgedruckt werden.

8voto

Matijs Punkte 3108

Vorausgesetzt, dass /foo nicht auf Ihrem System vorhanden ist und /tmp tut

$ ls -l /tmp /foo

druckt den Inhalt von /tmp und drucken eine Fehlermeldung für /foo

$ ls -l /tmp /foo > /dev/null

sendet den Inhalt von /tmp a /dev/null und drucken eine Fehlermeldung für /foo

$ ls -l /tmp /foo 1> /dev/null

tut genau dasselbe (beachten Sie die 1 )

$ ls -l /tmp /foo 2> /dev/null

druckt den Inhalt von /tmp und senden Sie die Fehlermeldung an /dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

sendet sowohl die Auflistung als auch die Fehlermeldung an /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

ist die Kurzform

5voto

Kalanidhi Punkte 4422

Dies ist genau wie die Übergabe des Fehlers an stdout oder das Terminal.

Das heißt, cmd ist kein Befehl:

$cmd 2>filename
cat filename

command not found

Der Fehler wird wie folgt an die Datei gesendet:

2>&1

Der Standardfehler wird an das Terminal gesendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X