如何为 rsync 输出的特定部分着色?

如何为 rsync 输出的特定部分着色?

我运行此命令将一些文件从 Windows (Cygwin) 同步到我的本地 NAS:

rsync -PaSq --delete -e "/cygdrive/C/cygwin64/bin/ssh -i keyfile -p XXXX" "/source/" [email protected]:/destination/

我现在想用红色突出显示任何错误消息。我的意思是突出显示 rsync 连接后的错误,而不是 ssh 连接错误。

所以这个 ssh 连接错误消息保持不变:

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]

但这以红色突出显示:

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

我尝试了以下方法但没有运气。任何想法表示赞赏。

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:.*|$'

答案1

您面临的问题来自于将rsync错误输出到标准误(文件描述符2),但默认情况下管道仅传输标准输出(文件描述符 1),保持标准错误不变。因此,管道之后的命令(sedgrep在您的示例中)看不到来自rsync.

|&您可以使用aka重定向 stdout 和 stderr 2>&1 |。另一种方法是仅重定向 stderr,将 stdout 保留在它指向的位置,因此请尝试以下操作:

rsync ... |& grep --color '.*rsync:.*'

或者

{ rsync ...  2>&1 >&3 3>&- | grep --color '.*rsync:.*' 3>&-; } 3>&1

第二种方法有点复杂,因为我们需要临时将 stdout 重定向到某个地方(3在本例中为描述符),以便不是将其传递给grep.

相关内容