Como posso colorir partes específicas da saída do rsync?

3

Eu executo este comando para rsync alguns arquivos do Windows (Cygwin) para o 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, destacando os erros do rsync, uma vez que ele se conecta 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 é destacado em vermelho:

rsync: delete_file: unlink(test/test.txt) failed: Permission denied (13)

Eu tentei o seguinte sem sorte. Qualquer idéia 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:.*|$'
    
por NoExpert 09.12.2017 / 23:14

1 resposta

2

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 .

    
por 09.12.2017 / 23:56