Seu problema é que você está redirecionando stderr antes redirecionando o stdout. Deve funcionar se você trocá-los. Para ilustrar, considere os seguintes scripts. foo.sh
é impresso em stderr e stdout:
#!/usr/bin/env bash
## foo.sh
## Print "out" to standard output
echo out
## Print "error" to standard error
echo error >&2
bar.sh
lê a entrada:
#!/usr/bin/env bash
## bar.sh
read input
## Print your input
echo "bar.sh read: $input"
E o mesmo acontece com baz.sh
:
#!/usr/bin/env bash
## baz.sh
read input
## Print your input
echo "baz.sh read: $input"
Agora, se eu executar esses três como você parece estar tentando fazer e passar sua saída para um loop while
, ele funcionará como esperado:
$ foo.sh 2> >(bar.sh) > >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: error
baz.sh read: out
No entanto, falha se você fizer o inverso:
$ foo.sh > >(bar.sh) 2> >(baz.sh) | while read line; do echo "$line"; done
bar.sh read: out