ich weiß was
program > /dev/null 2>&1
tut. Es leitet die Ausgabe an /dev/null
und 2>&1
bedeutet, dass die Fehlerausgabe an dieselbe Stelle umgeleitet wird, an die die Ausgabe gesendet wird.
Mein Problem ist, dass ich immer googeln muss, weil ich mich nie daran erinnere.
Also, ich versuche &2>1
, 1>2&
, 1>&2
... ich jede Kombination versuchen , bis ich es google ...
Was ist der Trick, um es leicht zu merken?
program 1> /dev/null 2>/dev/null
. Manchmal müssen Sie jedoch dasstdout
undstderr
zusammenmischen, um zu sehen, was wirklich vor sich geht - wie die Ausgabe eines komplexen Kompilierungsprozesses, der in eine Datei umgeleitet wird. In diesem FallAntworten:
Die Ausgabe ist besser als der Fehler, daher steht sie an erster Stelle (1 gegen 2).
>
ist die Abkürzung für "geht an". Links ist das, was ich senden möchte und rechts ist das, wohin ich es senden möchte. Da 'wo' (fast) immer eine Datei ist, so etwas wiewürde zu einer Datei mit dem Namen 1 umleiten. Daher
(&)
ändert das kaufmännische Und die Datei zum Dateideskriptor.Leider bin ich noch nicht auf meine eigene Mnemonik gestoßen oder habe sie entwickelt, aber als ich * nix zum ersten Mal lernte, fand ich diese logische Art, gut zu arbeiten. Nach ein paar Durchläufen wird es zur zweiten Natur.
quelle
stdout
ist Dateideskriptor 1,stderr
ist 2. "Fehler" kommt also vor "Ausgabe".stdout
undstderr
auf welchen verwiesen wird.Ein Trick besteht darin, sich daran zu erinnern, dass 1 = Standardausgabe, 2 = Standardfehler. Damit:
2>&1
= Standardfehlerstrom geht in Standardausgabestrom.1>&2
= umgekehrtWenn Sie jemals in einer C-ähnlichen Sprache programmiert haben, ist es einfach, sich das kaufmännische Und (
&
) zu merken . Ich betrachte es als "Adresse" des vorhandenen Dateideskriptors, damit Sie die Datei selbst nicht ändern oder eine neue erstellen.quelle
Das
&
als Knoten zu sehen könnte helfen: Überlegen Sie sich, was Sie tun möchten, indem Sie die Ausgabe von 2 nehmen2>
und sie mit 1 verknüpfen2>&1
quelle
Tatsächlich hängt es davon ab, welche Shell Sie verwenden. Bash ist normalerweise sehr nachsichtig und Sie können einfach tun:
quelle
Betrachten wir diese drei Optionen:
Der erste sendet stderr an einen Dateinamen "1": Schließlich erwartet bash die Weiterleitung in eine Datei.
Der zweite leitet ebenfalls zur selben Datei um, läuft aber
program
im Hintergrund: Das ist, was ein abschließender&
Text bedeuten soll.Damit ist die dritte Möglichkeit die einzige, die im Bash-Universum Sinn macht, um zu einem Datei-Handle umzuleiten.
Wie erinnerst du dich, welches unter 0, 1, 2 ist? Denken Sie daran, einen Computer von der Konsole aus zu starten. Zuerst müssen Sie etwas eingeben (0 = stdin). Dann sehen Sie die Ausgabe (1 = stdout). Zuletzt und nur wenn etwas schief geht, sehen Sie stderr (2).
quelle
Zeichne es in dein Hintergrundbild.
Nun, im Ernst, dieses und andere grundlegende Dinge habe ich immer wieder vergessen, also habe ich einer App, die ich entwickelt habe und die ich täglich benutze, ein Kurztipps-Menü hinzugefügt. Vielleicht möchten Sie es ausprobieren oder etwas wie gnote verwenden, um eine Notiz zu speichern.
quelle
In Bezug auf die Bash-Shell finde ich, dass man sich am besten daran erinnert, wenn man versteht, was passiert.
Wenn Sie sich nur daran erinnern möchten, wie Sie den Befehl korrekt ausführen, können Sie es versuchen
Das ist schön und offensichtlich, was los ist und leicht zu merken ist. dh
1
STDOUT geht an/results
2
STDERR geht auch direkt an/results
Das Problem ist, dass dies nicht wie erwartet funktioniert. Folgendes berücksichtigen:
Datei:
/tmp/poem.txt
und den Befehl ausführen
dann
was ist hier passiert?
Mein Verständnis ist Bash-Setup die Umleitung der STDERR direkt auf die Datei
/tmp/results
und aufgrund der Art der>
2 Dinge>>
tut.In diesem Fall wird also STDERR direkt an den Anfang des
/tmp/results
Überschreibens der Ausgabe von STDOUT eingefügt.Hinweis: Wenn Sie verwendet werden
>>
Sie wahrscheinlich mit dieser Syntax wegkommen könnte anhängen.Um das Problem zu beheben, müssen Sie STDERR jedoch nicht direkt in die Datei umleiten, sondern die STDERR-Ausgabe in den STDOUT-Stream einbinden, damit keine Kollision auftritt. Dies wird durch die
Verwendung des Operators
2>&1
operator erreichtDas
&
ermöglicht bash aus einer Datei zu unterscheiden benannt1
und den1
Dateideskriptor.Für mich
2>&1
erklärt die Anweisung selbst genau, was passiert - STDERR wird an STDOUT selbst umgeleitet - und endet nur damit,/tmp/results
dass auf STDOUT verwiesen wird (fast als Nebeneffekt).Im Gegensatz zu dem, was viele Guides behaupten, was
2>&1
STDERR dahin schickt, wohin STDOUT zeigt. Wenn das wahr wäre, hätten Sie immer noch das Überschreibproblem.Weitere Informationen finden Sie unter http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
quelle