Was macht "2>&1" in der Befehlszeile?

Ich weiß, dass das Zeichen > für die Ausgabeumleitung in der Befehlszeile verwendet wird, aber ich habe Probleme, etwas zu finden, das die Verwendung von 2>&1 in der Befehlszeile erklärt. Beispiel:

curl http://www.google.com > /dev/null 2>&1 &
Author: Cfinley, 2009-11-16

4 answers

Die 1 bezeichnet die Standardausgabe (stdout). Das 2 bezeichnet Standardfehler (stderr).

Also sagt 2>&1, um Standardfehler zu senden, wo immer auch Standardausgabe umgeleitet wird. Was, da es an /dev/null gesendet wird, damit verwandt ist, jede Ausgabe überhaupt zu ignorieren.

 84
Author: Chealion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2009-11-16 23:17:25

Tl;dr

Holt http://www.google.com im Hintergrund und verwirft sowohl stdout als auch stderr.

curl http://www.google.com > /dev/null 2>&1 &

Ist das gleiche wie

curl http://www.google.com > /dev/null 2>/dev/null &

Grundlagen

0, 1 und 2 repräsentiert die Standarddatei Deskriptoren in POSIX Betriebssystemen. Ein Dateideskriptor ist eine Systemreferenz auf (im Grunde) eine Datei oder oder.

Das Erstellen eines neuen Dateideskriptors in C kann ungefähr so aussehen:

fd = open("data.dat", O_RDONLY)

Die meisten Unix-Systembefehle übernehmen einige Eingaben und geben das Ergebnis an das Terminal aus. curl ruft alles ab, was sich unter der angegebenen URL befindet (google dot com), und zeigt das Ergebnis an stdout.

curl Ergebnis

Umleitung

Wie Sie gesagt haben, werden < und > verwendet, um die Ausgabe von einem Befehl an einen anderen Ort umzuleiten, wie eine Datei.

Zum Beispiel in ls > myfiles.txt, ls ruft den Inhalt des aktuellen Verzeichnisses ab und > leitet seine Ausgabe an myfiles.txt um (wenn die Datei nicht vorhanden ist, wird sie erstellt, andernfalls überschrieben, aber Sie können stattdessen >> anstelle von >, um sie an die Datei anzuhängen). Wenn Sie den obigen Befehl ausführen, werden Sie feststellen dem Terminal wird nichts angezeigt. Das bedeutet normalerweise Erfolg in Unix-Systemen. Um dies zu überprüfen cat myfiles.txt, um den Dateiinhalt auf dem Bildschirm anzuzeigen.

> /dev/null 2>&1

Der erste Teil > /dev/null leitet die stdout um, das heißt die Ausgabe von curl zu /dev/null (mehr dazu hier) und 2>&1 leitet die stderr zum stdout um (der gerade zu /dev/null umgeleitet wurde, damit alles an /dev/null gesendet wird).

Die linke Seite von 2>&1 sagt Ihnen , was umgeleitet wird, und die rechte Seite sagt Ihnen wo zu. Das & wird auf der rechten Seite verwendet, um stdout (1) oder stderr (2) von Dateien mit dem Namen 1 oder 2 zu unterscheiden. Daher würde 2>1 am Ende eine neue Datei mit dem Namen 1 erstellen (falls sie noch nicht vorhanden ist) und das Ergebnis stderr dort ablegen.

/dev/null

/dev/null ist eine leere Datei, ein Mechanismus, der verwendet wird, um alles zu verwerfen, was darauf geschrieben wurde. So, curl http://www.google.com > /dev/null unterdrückt effektiv die Ausgabe von curl.

> /dev/null

Aber warum wird auf dem Terminal noch etwas angezeigt?. Dies ist nicht curl's reguläre Ausgabe, aber Daten an die stderr gesendet, hier für die Anzeige von Fortschritt und Diagnoseinformationen und nicht nur Fehler.

curl http://www.google.com > /dev/null 2>&1 ignoriert sowohl die Ausgabe von curl als auch die Fortschrittsinformationen von curl. Das Ergebnis ist, dass auf dem Terminal nichts angezeigt wird.

Schließlich

Das & am Ende ist, wie Sie die Shell anweisen, den Befehl als Job im Hintergrund. Dadurch wird die Eingabeaufforderung sofort zurückgegeben, während der Befehl asynchron hinter den Kulissen ausgeführt wird. Um die aktuellen Jobs anzuzeigen, geben Sie jobs in Ihr Terminal ein. Beachten Sie, dass dies von den in Ihrem System ausgeführten Prozessen unterscheidet. Um diese zu sehen, geben Sie top im Terminal ein.

Referenzen

 32
Author: Jorge Bucaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-04-13 12:37:11

2 bezieht sich auf STDERR. 2>&1 sendet STDERR an denselben Ort wie 1 (STDOUT).

 5
Author: John T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2009-11-16 23:20:08

Ich verstehe wie folgt:

Wenn Sie nur die Ausgabe-und Fehlerinformationen des Befehls auf dem Bildschirm lesen möchten, schreiben Sie einfach: curl http://www.google.com

Und manchmal möchten Sie die Ausgabeinformationen in einer Datei anstelle des Terminalbildschirms für eine spätere Überprüfung speichern, dann können Sie schreiben: curl http://www.google.com > logfile

Auf diese Weise werden die StdErr-Informationen jedoch weggelassen, da > das StdOut nur zu logfile umleitet.

Wenn Sie sich also um die Fehlerinformationen des Befehls kümmern, sobald dieser fehlschlägt um auszuführen, müssen Sie StdOut mit StdErr kombinieren, indem Sie 2>&1 (was bedeutet, STDERR in StdOut zu falten), damit die folgende Befehlszeile geschrieben werden kann: curl http://www.google.com > logfile 2>&1

 0
Author: YaOzI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-12-06 08:08:41