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 &
command-line
shell
redirection
Matt Huggins
quelle
quelle
Antworten:
Das
1
kennzeichnet die Standardausgabe (stdout). Das2
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.quelle
0
(stdin),1
(stdout) und2
(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 versuchencurl
,curl 1>/dev/null
undcurl 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.tl; dr
Holen Sie sich
http://www.google.com
im Hintergrund und verwerfen Sie diestdout
undstderr
.ist das gleiche wie
Grundlagen
0
,1
Und2
stellt die Standard - Datei Deskriptoren in POSIX - Betriebssystemen. Ein Dateideskriptor ist eine Systemreferenz auf (im Grunde) eine Datei oder einen Socket .0 stdin
1 stdout
2 stderr
Das Erstellen eines neuen Dateideskriptors in C kann ungefähr so aussehen:
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 anzeigenstdout
.Umleitung
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 anmyfiles.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 Optioncat myfiles.txt
, um den Dateiinhalt auf dem Bildschirm anzuzeigen.> / dev / null 2> & 1
Der erste Teil
> /dev/null
leitet diestdout
, dhcurl
Ausgang s‘/dev/null
(mehr dazu im Voraus) und2>&1
leitet diestderr
zu demstdout
(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 unterscheidenstdout (1)
oderstderr (2)
von Dateien mit dem Namen1
oder2
. Am2>1
Ende würde also eine neue Datei mit dem Namen (falls noch nicht vorhanden) erstellt1
und dasstderr
Ergebnis dort abgelegt ./ dev / null
/dev/null
ist eine leere Datei, ein Mechanismus, mit dem alles verworfen wird, was darauf geschrieben wurde. Socurl http://www.google.com > /dev/null
wird effektiv diecurl
Ausgabe unterdrückt .Aber warum wird auf dem Terminal noch etwas angezeigt? Dies ist keine
curl
reguläre Ausgabe, sondern es werden Daten an gesendetstderr
, 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 sowohlcurl
die Ausgabe- als auch diecurl
Fortschrittsinformationen. Das Ergebnis ist, dass nichts auf dem Terminal angezeigt wird.Endlich
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 Siejobs
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 Sietop
das Terminal ein.Verweise
quelle
/dev/null
? Willst du nicht die Ergebnisse dercurl
zumindest irgendwo nützlich?2
bezieht sich auf STDERR.2>&1
sendet STDERR an denselben Speicherort wie1
(STDOUT).quelle
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 wirdlogfile
.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> & 1quelle