TL; DR: (bash і zsh)
$ cmd 2> >(stderr-filter >&2)
Приклад:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
Багато відповідей у мережі StackExchange мають вигляд:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
Це має вбудоване припущення: що дескриптор файлу 3 не використовується для чогось іншого.
Натомість використовуйте іменований дескриптор файлу та {ba,z}shвиділіть наступний доступний дескриптор файлу> = 10:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
Зверніть увагу, що іменовані дескриптори файлів не підтримуються POSIX sh .
Інша проблема з вищезазначеним полягає в тому, що команду не можна переводити до подальших команд, не повторно замінюючи STDOUT та STDERR на початкові значення.
Щоб дозволити подальші трубопроводи в POSIX sh, (і все ще припускаючи, що FD 3 не використовується), це ускладнюється :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
Отже, беручи до уваги припущення та чіткий синтаксис цього, вам, швидше за все, буде краще використовувати простіший bash/ zshсинтаксис, показаний у TL; DR вище, і пояснення тут .