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 выше и объясненный здесь .