Angenommen, ich habe einen Code, der in einem sehr ausführlichen Modus ausgeführt wird. Diese maximale Ausführlichkeit zeigt eine Nachricht an, die ich gerne lesen würde, um zu sehen, wie alles läuft. Das Terminal wird jedoch mit anderen Inhalten überflutet.
Gibt es eine Möglichkeit, die Stderror-Ausgabe mit einem Grep-Filter zu filtern, ohne die Stderror-Pipeline in die Stdout-Pipeline zu überführen?
Zum Beispiel,
my-command 2>&1 | grep something # ok, great; is it possible without the pipe shift?
Ist das möglich?
i.e., maybe
my-command 2>(grep something)?
Antwort1
Ich füge diese beiden Optionen als Antworten ein, obwohl sie die Frage nicht wirklich beantworten (die Antwort lautet „in Bash nein“), für den Fall, dass jemand anderes dies sieht, und um die Methode zum Vertauschen von stdout und stderr anzuzeigen und die Formatierung richtig zu machen (anders als in Kommentaren).
Antwort eins: Angenommen, dies ist ein Programm, das Sie ausführen möchten (ich weiß, es sieht nicht wie ein Befehl aus, aber tun Sie so, als wäre es einer; ersetzen Siealledavon mit dem Befehl und den Argumenten, die Sie tatsächlich ausführen möchten):
{ echo stdout; echo stderr >&2; }
Nehmen Sie nun an, Sie möchten nur stderr nach etwas durchsuchen, stdout aber unverändert lassen.
{ echo stdout; echo stderr >&2; } 2> >(grep something)
Wenn dasalleWenn Sie das getan haben, erhalten Sie die gesamte Standardausgabe und Teile von Standardfehler, die etwas enthalten, alles durchsetzt. Sie möchten Standardausgabe und Standardfehler möglicherweise in separate Dateien schreiben, um sie später anzuzeigen:
{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile
Informationen zum Vertauschen von stdout und stderr (und warum Sie das tun sollten) finden Sie unterhttps://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderrfür eine bessere Erklärung, als ich geben kann.