Manchmal möchten Sie sowohl stdout als auch stderr an denselben Speicherort umleiten. In diesem Fall >&
wird ein Dateideskriptor auf einen anderen verwiesen.
Wenn Sie beispielsweise sowohl stdout als auch stderr in dieselbe Datei schreiben möchten (sei es /dev/null
oder output.txt
), können Sie sie separat mit umleiten
app 1>/dev/null 2>/dev/null
Oder Sie können einen Dateideskriptor in die Datei umleiten und den anderen in den ersten:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Im ersten Beispiel 2>&1
zeigt der Dateideskriptor Nr. 2 auf die Stelle, auf die Nr. 1 bereits zeigt. Das zweite Beispiel erreicht dasselbe, indem es stattdessen mit stderr beginnt.
Als weiteres Beispiel gibt es Fälle, in denen stdout (Dateideskriptor Nr. 1) bereits auf den gewünschten Speicherort verweist, Sie jedoch nicht namentlich darauf verweisen können (dies kann mit einer Pipe, einem Socket oder dergleichen verbunden sein). Dies ist häufig der Fall, wenn Sie die Prozesserweiterung (die Operatoren ` `
oder $( )
) verwenden, mit der normalerweise nur stdout erfasst wird. Möglicherweise möchten Sie jedoch stderr einbeziehen. In diesem Fall würden Sie auch >&
stderr auf stdout zeigen:
out=$(app 2>&1)
Ein weiteres häufiges Beispiel ist ein Pager grep
oder ein ähnliches Dienstprogramm. Da die Pipe |
normalerweise nur auf stdout funktioniert, würden Sie stderr vor der Verwendung der Pipe auf stdout umleiten:
app 2>&1 | grep hello
Wie kann man wissen, von welchem 2>&1
oder 1>&2
was richtig ist? Der bereits eingerichtete Dateideskriptor befindet sich rechts von >&
und der Dateideskriptor, den Sie umleiten möchten, befindet sich links von. ( 2>&1
bedeutet "Punktdateideskriptor # 2 bis Dateideskriptor # 1".)
Einige Shells verfügen über Verknüpfungen für allgemeine Umleitungen. Hier sind Beispiele von Bash:
1>
kann auf gerade gekürzt werden >
1>foo 2>&1
zu >&foo
oder&>foo
2>&1 | program
zu |& program
app 1>/dev/null 2>&1
bedeuten würde, dass 2> & 1 auf die Datei verweisen würde, zu der 1 bereits umgeleitet hat. Ich nehme an, ich könnte es genauso leicht tunapp > /dev/null &>
?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
. Was meinst du mit dem bereits eingerichteten Dateideskriptor? Was bedeutet es, das Recht von?Eine Situation, die Sie benötigen, ist, wenn Sie die
strace
Ausgabe in einem Pager anzeigen möchten .strace
druckt Standard seines Ausgangsfehler und Leitungen im Allgemeinen Standard verbindet Ausgang der Standardeingabe, so dass Sie die Umleitung verwenden:quelle
pipes generally connect standard output to standard input
?|
) die Standardausgabe des ersten Befehls nimmt und sie mit der Standardeingabe des zweiten Befehls verbindet.Manchmal möchten Sie sowohl
stdout
(1
) als auchstderr
(2
) an denselben Speicherort umleiten (/dev/null
z. B.). Ein Weg, dies zu erreichen, wäre:Aber die meisten Menschen verkürzen dies durch Umleitung
stderr
aufstdout
mit2>&1
:Eine noch kürzere Version ist:
quelle
2: Dies ist der Fall, wenn die Ausgabe sowohl von Standardfehlern als auch von Standardausgängen stammen soll und Sie möchten, dass sie zu einer einzelnen Zeichenfolge zusammengefasst werden.
1: Wenn Sie die Ausgabe von Standardfehler und Standardausgang bearbeiten möchten.
quelle
>2
wird, an / dev / null gesendet wird. Oder habe ich mich völlig geirrt?Ich benutze es, um einen freistehenden Job zu starten:
dann kann ich mich abmelden und someProgram läuft noch. Die Funktionalität wird von GNU Screen, tmux und einigen anderen Programmen bereitgestellt - hier wird sie jedoch ohne externe Abhängigkeiten erreicht.
quelle
nohup
oderdisown
in solchen Fällen.Stellen Sie sich vor, es gibt ein Verzeichnis
try
mit den folgenden drei Dateien:file file1 and file2.
Führen Sie nun diesen Befehl aus:
Die ersten drei Dateien werden geöffnet, aber
cat
beim Öffnen der vierten Datei tritt ein Fehler auf, da diese nicht vorhanden ist.Führen Sie nun Folgendes aus:
Sie werden keine Ausgabe auf dem Bildschirm sehen: Erstens
1>outfile
wird die Ausgabe des Befehls anoutfile
umgeleitet , und dann wird2>&1
der Fehler, der beim Öffnenfile3
von ausgegeben wurde, umgeleitet ( )outfile
.1>&2
Funktioniert ähnlich und leitet den Fehlerstrom zur Standardausgabe um.Hoffe das hilft!
quelle
Verwenden Sie den
tty
Befehl in jedem Terminal, um sie zu identifizieren:Unter der Annahme, dass diese TTYs die Standardausgabe der ersten auf die zweite umleiten, führen Sie diese im ersten Terminal aus:
So stellen Sie das Standardverhalten stdout von pts / 0 wieder her:
In diesem Video sehen Sie eine Demonstration.
quelle
Der Fall, dass stderr auf stdout umgeleitet wird, wurde hier bereits behandelt (z. B. um Fehlermeldungen (grep) zu filtern).
Der andere Fall ist die Umleitung von stdout nach stderr. Ein häufiger Anwendungsfall (zumindest für mich) ist das Senden von Warnungen / Fehlermeldungen, die mit "Echo" (in meinen Shellscripts) gedruckt sind, an den stderr (damit sie die Aufmerksamkeit des Benutzers leichter auf sich ziehen können).
Beispielsweise,
quelle