Eu executo este comando para rsync alguns arquivos do Windows (Cygwin) para meu NAS local:
rsync -PaSq --delete -e "/cygdrive/C/cygwin64/bin/ssh -i keyfile -p XXXX" "/source/" [email protected]:/destination/
Agora quero destacar em vermelho todas as mensagens de erro. Com isso, quero dizer destacar os erros do rsync assim que ele se conectar e não os erros de conexão ssh.
Portanto, esta mensagem de erro de conexão ssh permanece inalterada:
ssh_exchange_identification: Connection closed by remote host
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.2]
Mas isso está destacado em vermelho:
rsync: delete_file: unlink(test/test.txt) failed: Permission denied (13)
Eu tentei o seguinte sem sorte. Qualquer ideia é apreciada.
rsync -PaSq --delete -e "/cygdrive/C/cygwin64/bin/ssh -i keyfile -p XXXX" "/source/" [email protected]:/destination/ | tput setaf 1; sed -n '/rsync:/p'
rsync -PaSq --delete -e "/cygdrive/C/cygwin64/bin/ssh -i keyfile -p XXXX" "/source/" [email protected]:/destination/ | egrep --color '.*rsync:.*|$'
rsync -PaSq --delete -e "/cygdrive/C/cygwin64/bin/ssh -i keyfile -p XXXX" "/source/" [email protected]:/destination/ | grep --color=auto '.*rsync:.*|$'
O problema que você enfrenta vem do fato de que
rsync
gera 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. Portanto, o comando após o pipe (sed
ougrep
no seu exemplo) não vê erros provenientes dersync
.Você pode redirecionar stdout e stderr usando
|&
aka2>&1 |
. Outra abordagem é redirecionar apenas stderr, deixando stdout onde apontava, então tente algo como:ou
A segunda abordagem é um pouco complicada porque precisamos redirecionar temporariamente o stdout para algum lugar (para o descritor
3
neste caso) para não passá-lo para o arquivogrep
.