O problema que você enfrenta vem do fato de que rsync
produz erros para o erro padrão (descritor de arquivo 2), mas o pipe por padrão transfere apenas a saída padrão (descritor de arquivo 1), deixando o erro padrão intocado. Então o comando após o pipe ( sed
ou grep
em seu exemplo) não vê erros que vieram de rsync
.
Você pode redirecionar stdout e stderr usando |&
aka 2>&1 |
. Outra abordagem é redirecionar somente o stderr, deixando o stdout onde ele apontava, então tente algo como:
rsync ... |& grep --color '.*rsync:.*'
ou
{ rsync ... 2>&1 >&3 3>&- | grep --color '.*rsync:.*' 3>&-; } 3>&1
A segunda abordagem é um pouco complicada porque precisamos redirecionar temporariamente o stdout para algum lugar (para descritor 3
neste caso) para não passá-lo para o grep
.