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

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

最佳答案

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

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

关于bash - 使用 tee 重定向文件描述符 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5012280/

相关文章:

macos - 在 Mac OS X 中,如何获得文件描述符使用的准确计数?

linux - 连接两个 csv 文件

linux - 如果在 Linux 中任何其他列中有零,如何将除第一列以外的整行设为零?

bash - OpenSSL 解密 AES 256 位(base64)加密密码 - 错误的最终 block 长度

shell - 记录 Shell 输出

linux - 如何大量使用转换命令,一个干净的正则表达式扫描?

c - 用 C 编写自己的 Unix shell - PATH 和 execv 的问题

linux - 在 bash 中比较 float

linux - ssh 无法与 sudo 一起正常工作

linux - SSH,运行进程然后忽略输出