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

时间:2011-02-16 03:36:04

标签: bash shell unix redirect tee

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

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

我找不到sudorsynctee的文件描述符3的任何特殊处理。重定向后,我正在猜测这种情况:

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

请注意,悬挂文件描述符3可以使用3>&-关闭,这里包含了完整的一行:

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