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