Ich weiß, dass das >
Zeichen für die Ausgabeumleitung in der Befehlszeile verwendet wird, habe jedoch Probleme, eine Erklärung für die Verwendung 2>&1
in der Befehlszeile zu finden. Zum Beispiel:
curl http://www.google.com > /dev/null 2>&1 &
Ich weiß, dass das >
Zeichen für die Ausgabeumleitung in der Befehlszeile verwendet wird, habe jedoch Probleme, eine Erklärung für die Verwendung 2>&1
in der Befehlszeile zu finden. Zum Beispiel:
curl http://www.google.com > /dev/null 2>&1 &
Antworten:
Das 1
kennzeichnet die Standardausgabe (stdout). Das 2
kennzeichnet Standardfehler (stderr).
So 2>&1
sagt Standardfehler zu senden , wo immer die Standardausgabe als auch umgeleitet wird. Was, seitdem es gesendet /dev/null
wird, so etwas wie das Ignorieren von Ausgaben ist.
0
(stdin), 1
(stdout) und 2
(stderr) tatsächlich Dateideskriptoren sind, benötigt die Shell ein kaufmännisches Und, das ihnen zur Umleitung vorangestellt wird. In diesem Fall wird der Dateideskriptor dupliziert, wodurch die beiden Informationsströme effektiv zusammengeführt werden.
curl http://www.google.com 2>/dev/null
Woher weiß die Befehlszeile, dass die "2" hier "stderr" bedeutet und nicht der zweite Parameter ist, den ich an den Befehl "curl" übergebe?
stderr
direkt an senden /dev/null
. Sie können es in der Praxis sehen , indem Sie versuchen curl
, curl 1>/dev/null
und curl 2>/dev/null
nur die Ausgabe Änderung zu sehen. Auch hier wird das kaufmännische Und nur für den Dateideskriptor benötigt, zu dem umgeleitet wird.
Holen Sie sich http://www.google.com
im Hintergrund und verwerfen Sie die stdout
und stderr
.
curl http://www.google.com > /dev/null 2>&1 &
ist das gleiche wie
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
Und 2
stellt die Standard - Datei Deskriptoren in POSIX - Betriebssystemen. Ein Dateideskriptor ist eine Systemreferenz auf (im Grunde) eine Datei oder einen Socket .
Das Erstellen eines neuen Dateideskriptors in C kann ungefähr so aussehen:
fd = open("data.dat", O_RDONLY)
Die meisten Unix-Systembefehle nehmen eine Eingabe vor und geben das Ergebnis an das Terminal aus. curl
wird holen, was an der angegebenen URL ist ( google dot com ) und das Ergebnis anzeigen stdout
.
Wie Sie sagten <
und >
verwendet werden, um die Ausgabe von einem Befehl an einen anderen Ort, wie eine Datei, umzuleiten.
Zum Beispiel in ls > myfiles.txt
, ls
wird der Inhalt des aktuellen Verzeichnisses und >
leitet seine Ausgabe an myfiles.txt
(wenn die Datei nicht vorhanden ist erstellt wird, sonst überschrieben, aber Sie verwenden können , >>
statt >
stattdessen an die Datei angehängt). Wenn Sie den obigen Befehl ausführen, werden Sie feststellen, dass im Terminal nichts angezeigt wird. Das bedeutet normalerweise Erfolg in Unix-Systemen. Aktivieren Sie diese Option cat myfiles.txt
, um den Dateiinhalt auf dem Bildschirm anzuzeigen.
Der erste Teil > /dev/null
leitet die stdout
, dh curl
Ausgang s‘ /dev/null
(mehr dazu im Voraus) und 2>&1
leitet die stderr
zu dem stdout
(die gerade umgeleitet wurde /dev/null
alles so gesendet werden soll /dev/null
).
Auf der linken Seite von 2>&1
erfahren Sie, was umgeleitet wird, und auf der rechten Seite, wohin . Das &
ist auf der rechten Seite verwendet , zu unterscheiden stdout (1)
oder stderr (2)
von Dateien mit dem Namen 1
oder 2
. Am 2>1
Ende würde also eine neue Datei mit dem Namen (falls noch nicht vorhanden) erstellt 1
und das stderr
Ergebnis dort abgelegt .
/dev/null
ist eine leere Datei, ein Mechanismus, mit dem alles verworfen wird, was darauf geschrieben wurde. So
curl http://www.google.com > /dev/null
wird effektiv die curl
Ausgabe unterdrückt .
Aber warum wird auf dem Terminal noch etwas angezeigt? Dies ist keine curl
reguläre Ausgabe, sondern es werden Daten an gesendet stderr
, die hier zur Anzeige des Fortschritts und von Diagnoseinformationen und nicht nur von Fehlern verwendet werden .
curl http://www.google.com > /dev/null 2>&1
Ignoriert sowohl curl
die Ausgabe- als auch die curl
Fortschrittsinformationen. Das Ergebnis ist, dass nichts auf dem Terminal angezeigt wird.
Am &
Ende teilen Sie der Shell mit, dass der Befehl als Job im Hintergrund ausgeführt werden soll . Dadurch kehrt die Eingabeaufforderung sofort zurück, während der Befehl asynchron hinter den Kulissen ausgeführt wird. Geben Sie jobs
Ihr Terminal ein, um die aktuellen Aufträge anzuzeigen. Hinweis : Dies ist verschieden von den Prozessen in dem System ausgeführt wird . Um diese zu sehen, geben Sie top
das Terminal ein.
/dev/null
? Willst du nicht die Ergebnisse der curl
zumindest irgendwo nützlich?
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 für eine spätere Überprüfung in einer Datei anstelle des Terminalbildschirms speichern. Dann können Sie Folgendes schreiben:
curl http://www.google.com > logfile
Auf diese Weise werden jedoch die StdErr-Informationen ausgelassen, da >
nur das StdOut an umgeleitet wird logfile
.
Wenn Sie sich also um die Fehlerinformationen des Befehls kümmern, sobald dieser nicht ausgeführt werden kann, müssen Sie StdOut mit StdErr kombinieren 2>&1
(was bedeutet, dass StdErr in StdOut gefaltet wird), sodass die folgende Befehlszeile geschrieben werden kann:
curl http://www.google.com > logfile
2> & 1