几个月前我写了这个脚本,现在重读它,我无法理解这行的意思:
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 没有悬空。流程结束时它将关闭。
关于bash - 使用 tee 重定向文件描述符 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012280/