【问题标题】:Redirecting file descriptor 3 with tee使用 tee 重定向文件描述符 3
【发布时间】:2011-02-16 03:36:04
【问题描述】:

几个月前我写了这个脚本,现在重读,我无法理解这行的意思:

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 是否未关闭或以任何“不良”方式挂起?

【问题讨论】:

    标签: bash shell unix redirect tee


    【解决方案1】:

    你的猜测是对的。交换标准输出和标准错误是一个相当不错的技巧。回答您的问题:

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

    【讨论】:

    • 在执行 sudo 之前是否有必要或可能关闭 fd 3?我听说有一些程序可以通过这种方式传递打开的流。
    • 通常不需要,因为进程不应该关心哪些文件描述符已经打开。有一种方法可以移动 bash 中的文件描述符(而不是复制它),它会关闭原始文件。因此,您可以使用该获取文件句柄 3 关闭。我从未尝试过(因为我从未有过需要),但在 bash 手册页中查找“移动文件描述符”。
    【解决方案2】:

    请注意,悬空文件描述符3 可以用3>&- 关闭,以下是包含的完整行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2011-07-03
      • 2023-03-22
      相关资源
      最近更新 更多