bash – 使用tee重定向文件描述符3

几个月前我写了这个脚本,现在重读它,我无法破译这句话的意思:

sudo rsync -xPRSaz --rsync-path='sudo rsync' maeve@macbook:/ macbook/ 3>&1 1>&2 2>&3 | tee macbook.log

对于sudo,rsync或tee,我找不到文件描述符3的任何特殊处理.重定向后,我目前正在猜测这种情况:

now fd points to old fd
     0    -->         0
     1    -->         2
     2    -->         1
     3    -->         1

>这些重定向是应用于sudo,还是rsync,以及结束?
>文件描述符3是否未被封闭或以任何“坏”方式挂起?

最佳答案 你的猜测是正确的.交换标准输出和标准错误是一个相当漂亮的技巧.回答你的问题:

>这些重定向由shell捕获,因此它们适用于管道的那部分(即sudo). sudo进程本身将检测所有参数并将它们传递给它的子命令(rsync),但重定向已被捕获并在该点之前执行:sudo从未看到它们.
>文件句柄3没有悬空.它将在流程结束时关闭.

点赞