TL; DR: (bash y zsh)
$ cmd 2> >(stderr-filter >&2)
Ejemplo:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
Muchas respuestas en la red StackExchange tienen la forma:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
Esto tiene una suposición incorporada: que el descriptor de archivo 3 no se usa para otra cosa.
En su lugar, utilice un descriptor de archivo con nombre y {ba,z}sh
asignará el siguiente descriptor de archivo disponible> = 10:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
Tenga en cuenta que POSIX no admite descriptores de archivos con nombre sh
.
El otro problema con lo anterior es que el comando no se puede canalizar a otros comandos sin volver a intercambiar STDOUT y STDERR a sus valores originales.
Para permitir la tubería en adelante en POSIX sh
, (y aún asumiendo que FD 3 no se usa) se vuelve complicado :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
Entonces, dada la suposición y la sintaxis retorcida de esto, es probable que sea mejor usar la sintaxis bash
/ más simple que se zsh
muestra en el TL; DR anterior y se explica aquí .