Wie kann ich mich daran erinnern, wie die Umleitung verwendet wird?


40

ich weiß was

  program > /dev/null 2>&1 

tut. Es leitet die Ausgabe an /dev/nullund 2>&1bedeutet, 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?


Ich habe das gleiche Problem, also mache ich es auf die "lange" Strecke - leite beide um program 1> /dev/null 2>/dev/null. Manchmal müssen Sie jedoch das stdoutund stderrzusammenmischen, um zu sehen, was wirklich vor sich geht - wie die Ausgabe eines komplexen Kompilierungsprozesses, der in eine Datei umgeleitet wird. In diesem Fall
google

Antworten:


20

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 wie

program > /dev/null 2>1

wü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.


Dein erster Satz ergibt für mich keinen Sinn. stdoutist Dateideskriptor 1, stderrist 2. "Fehler" kommt also vor "Ausgabe".
Warren Young

Dieser Satz ist ein Mnemon, um sich zu erinnern, auf welchen Dateideskriptor stdoutund stderrauf welchen verwiesen wird.
gvkv

Okay, aber es scheint immer noch verwirrend zu sein, da es in der ursprünglichen Frage darum geht, sich an die Reihenfolge der Zeichen in der "2> & 1" -Zauberformel zu erinnern.
Warren Young

9

Ein Trick besteht darin, sich daran zu erinnern, dass 1 = Standardausgabe, 2 = Standardfehler. Damit:

2>&1= Standardfehlerstrom geht in Standardausgabestrom.
1>&2= umgekehrt

Wenn 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.


7

Das &als Knoten zu sehen könnte helfen: Überlegen Sie sich, was Sie tun möchten, indem Sie die Ausgabe von 2 nehmen 2>und sie mit 1 verknüpfen2>&1


2
Ich habe gerade den Satz "zwei aus und eins" auswendig gelernt. Ob es sich bei Ihrer Mnemonik um eine Phrase oder um einen Knoten handelt, es ist wirklich hilfreich, eine zu haben.
Tim Kennedy

5

Tatsächlich hängt es davon ab, welche Shell Sie verwenden. Bash ist normalerweise sehr nachsichtig und Sie können einfach tun:

program &> file

5

Betrachten wir diese drei Optionen:

program  2>1
program  2>1& 
program  2>&1

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 programim 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).


1

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.


1

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

program > /results 2> /results

Das ist schön und offensichtlich, was los ist und leicht zu merken ist. dh

  • 1 STDOUT geht an /results
  • 2STDERR geht auch direkt an/results

Das Problem ist, dass dies nicht wie erwartet funktioniert. Folgendes berücksichtigen:

Datei: /tmp/poem.txt

the quick brown fox jumped over the lazy dog

und den Befehl ausführen

grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results

dann

$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
 lazy dog

was ist hier passiert?
Mein Verständnis ist Bash-Setup die Umleitung der STDERR direkt auf die Datei /tmp/resultsund aufgrund der Art der >2 Dinge

  1. normalerweise eine neue Datei erstellen - in diesem Fall die Möglichkeit bestanden hat , wie bash Vergangenheit dieser Routine zu dem Zeitpunkt wird der Ausgang erzeugt bewegt hat.
  2. Direkt an den Anfang der Datei einfügen. und nicht anhängen wie es >>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>&1operator erreicht

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

Das &ermöglicht bash aus einer Datei zu unterscheiden benannt 1und den 1Dateideskriptor.
Für mich 2>&1erklärt die Anweisung selbst genau, was passiert - STDERR wird an STDOUT selbst umgeleitet - und endet nur damit, /tmp/resultsdass auf STDOUT verwiesen wird (fast als Nebeneffekt).
Im Gegensatz zu dem, was viele Guides behaupten, was 2>&1STDERR 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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.