Sie müssen weiterleiten stderr
an stdout
:
$ ./somecommad 2>&1 | less
Überprüfen Sie das Handbuch für Ihre Shell (z man bash
. B. )
Ich schaue mir die Ausgabe meines komplizierten Befehls an less
, Problem ist das stderr
geht verloren. stderr
Zeilen werden normalerweise zwischen stdout
Zeilen innerhalb aufgelistet less
. Ich möchte, dass sie auf der Konsole gedruckt werden, und wenn ich das Fenster verlasse less
, um sie dort zusammen zu sehen.
Mir ist klar, dass es dafür keine Lösung gibt, ich habe darüber gelesen tee
und bisher multitee
kein Glück.
Sie müssen weiterleiten stderr
an stdout
:
$ ./somecommad 2>&1 | less
Überprüfen Sie das Handbuch für Ihre Shell (z man bash
. B. )
Könnte sein
command 2> command.err | less; cat command.err; rm command.err
Nachtrag
Hier folgt eine Klarstellung für Leute, die die Frage nicht sorgfältig lesen und die oben erläuternden Erläuterungen des OP nicht gelesen haben.
haelix wies darauf hin:
stderr-Zeilen werden normalerweise zwischen stdout-Zeilen innerhalb von less aufgelistet
und schrieb in einem Kommentar für frühe Antwortende:
Sie sagen mir, wie man stderr auf stdout umleitet, aber das wollte ich nicht. Ich möchte nicht, dass sich stderr mit stdout in weniger mischt. Ich möchte, dass stderr im Terminal ist, wenn ich weniger verlasse
Das Problem ist wahrscheinlich plattformspezifisch, es ist sicherlich etwas, das ich auf älteren Unix-SVR4-Plattformen erlebt habe.
Wenn Sie auf solchen Plattformen so etwas tun
find / ... | less
etwaige Fehlermeldungen (z. B. Verzeichnisberechtigungen) werden in weniger so angezeigt
stdout line 1 stdout line 2 error message text stdout line 4
So werden die Ausgabezeilen durch Fehlermeldungen verdeckt.
Wenn Sie die Seite aktualisieren, werden die Ausgabezeilen korrekt angezeigt, die Fehlermeldungen gehen jedoch verloren. Wenn Sie weniger beenden, wird der Bildschirm mit Ausnahme einer Eingabeaufforderung gelöscht.
Wenn du sowas machst
find / ... 2>&1 | less
Die Fehlermeldungen werden mit der Standardausgabe vermischt. Wenn Sie weniger beenden, ist der Bildschirm leer.
Wenn Sie zunächst nur die Standardausgabe in weniger anzeigen möchten und nach dem Beenden der Fehlermeldung die Fehlermeldungen sehen, benötigen Sie eine andere Lösung.
Das habe ich in meiner ursprünglichen, zweizeiligen Antwort vorläufig vorgeschlagen.
just tell the shell to redirect fd 2 to fd 1 (stderr to stdout)
make 2>&1 | less
Was bei allen Antworten bisher fehlte, ist der Grund, warum dies geschieht. Das Problem hier ist eine Art Race-Bedingung zwischen dem Prozess, der Sachen an das Terminal ausgibt stderr
und less
die Ausgabe davon anzeigt stdout
. Wenn less
angezeigt wird, nachdem alle Ausgaben an stderr
das Terminal gedruckt wurden, less
wird dies beibehalten, und Sie können die Meldungen nach dem Beenden sehen less
. Wenn OTOH less
bereits mit dem Anzeigen von Daten begonnen hat, vermischen sich die Fehlermeldungen mit less
der Ausgabe und nichts bleibt nach dem Beenden erhalten less
(da less
das Terminal nur so bleibt, wie es war, bevor es gestartet wurde, und nichts über die dazwischen liegenden Fehlermeldungen weiß).
Sie können das leicht sehen, wenn Sie z
grep foo -r /etc | less
Alle Fehlermeldungen "Permission denied" mischen sich mit der less
Ausgabe, und nach dem Beenden ist nichts mehr vorhanden. Wenn Sie tun
grep foo -r /etc | (sleep 10; less)
Alle (oder zumindest die meisten) Fehlermeldungen wurden an das Terminal less
ausgegeben, bevor die Ausgabe angezeigt werden kann. Anschließend werden die Fehlermeldungen angezeigt.
Natürlich möchten Sie normalerweise nicht 10 Sekunden vor dem Start warten less
, aber mit Linux können Sie auch Bruchwerte für die Wartezeit angeben. Bei schnell ablaufenden Prozessen reicht oft etwas sleep 0.1
aus, um die Race-Bedingung zu umgehen. (Aber wenn Sie auf der wirklich sicheren Seite sein wollen oder müssen, verwenden Sie die Lösung von RedGrittyBrick.)
Sie müssen das Konzept der "Dateideskriptoren" verstehen. Normalerweise beginnt eine Unix-Anwendung mit drei speziellen Dateideskriptoren:
Das "Rohr" |
in der Schale verbindet sich stdout
von einem Prozess mit stdin
dem nächsten.
Fehler werden konstruktionsbedingt nicht in stdin
den nächsten Prozess übernommen. Sie sind oft für die nächste Anwendung nicht sinnvoll und sollten dem Benutzer nicht verborgen bleiben.
Wenn Sie die Fehler in stdout mischen möchten, können Sie zB Folgendes verwenden 2>&1
: "stderr an stdout anhängen". Zum Beispiel
find /etc 2>&1 | less
sollte auch Fehlerausgabe von nicht zugänglichen Dateien enthalten.
find /etc 2>&1 >/dev/null | less
gibt Ihnen nur die Fehler.
I'm confused about your question, as far as I ca tell your desired behavior is the default.
When I use
#include <stdio.h> int main(int argc, char**argv){ for (int j=0; j<10; ++j){ fprintf( (j%2 ? stdout : stderr), "%d\n", j); } return 0; }
to get a simple test,
$ ./testredirection | less
does just what you ask. That is I see
1 3 5 7 9 (END)
in less
and
$ ./testredirection | less 0 2 4 6 8 $
when I quit less
Dieses Problem ist kürzlich in einem meiner Debian 5.0 aufgetreten. zum Beispiel ls abc | Weniger finde ich, dass die Fehlermeldung in weniger geht, was gegen mein Wissen verstößt.
Nach einigen Versuchen stellte ich fest, dass es sich nur um Bildschirmpuffer handelt. stderr geht eigentlich NICHT in weniger. Sie können die Aufwärts- oder Abwärtspfeiltasten (oder j / k) zur Demonstration verwenden.