TL; DR: (bash und zsh)
$ cmd 2> >(stderr-filter >&2)
Beispiel:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
Viele Antworten im StackExchange-Netzwerk haben die Form:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
Dies hat eine eingebaute Annahme: Der Dateideskriptor 3 wird nicht für etwas anderes verwendet.
Verwenden Sie stattdessen einen benannten Dateideskriptor und {ba,z}shweisen Sie den nächsten verfügbaren Dateideskriptor> = 10 zu:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
Beachten Sie, dass benannte Dateideskriptoren von POSIX nicht unterstützt werden sh.
Das andere Problem mit dem oben Gesagten ist, dass der Befehl nicht an weitere Befehle weitergeleitet werden kann, ohne STDOUT und STDERR wieder auf ihre ursprünglichen Werte zurückzusetzen.
Um eine Weiterleitung in POSIX zu ermöglichen sh(und immer noch davon auszugehen, dass FD 3 nicht verwendet wird), wird es kompliziert :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
Angesichts der Annahme und der knorrigen Syntax ist es wahrscheinlich besser, die einfachere bash/ zshSyntax zu verwenden, die in der obigen TL; DR gezeigt und hier erläutert wird .