我运行此命令将一些文件从 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),保持标准错误不变。因此,管道之后的命令(sed
或grep
在您的示例中)看不到来自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
.