TL; DR: (bash i zsh)
$ cmd 2> >(stderr-filter >&2)
Przykład:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
Wiele odpowiedzi w sieci StackExchange ma postać:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
Ma to wbudowane założenie: ten deskryptor pliku 3 nie jest używany do czegoś innego.
Zamiast tego użyj nazwanego deskryptora pliku i {ba,z}sh
przydzieli następny dostępny deskryptor pliku> = 10:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
Zauważ, że nazwane deskryptory plików nie są obsługiwane przez POSIX sh
.
Innym problemem związanym z powyższym jest to, że polecenie nie może być przesłane potokiem do dalszych poleceń bez ponownego zamiany STDOUT i STDERR z powrotem na ich oryginalne wartości.
Aby umożliwić sh
dalsze przesyłanie rur w POSIX (i nadal zakładając, że FD 3 nie jest tego używany), sprawa się komplikuje :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
Tak więc, biorąc pod uwagę założenie i gnarly składnię tego, prawdopodobnie lepiej będzie, jeśli użyjesz prostszej bash
/ zsh
składni pokazanej w TL; DR powyżej i wyjaśnionej tutaj .