Bash 复杂重定向(这个命令的作用是什么)?

Bash 复杂重定向(这个命令的作用是什么)?

我最近正在搞乱一个 AWS 虚拟机设置脚本。文档说要包含这一行:

exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
yum -y update
echo "Hello from user-data!"

以便您稍后可以从 AWS 网站访问虚拟机日志。

但AWS在这里并不重要,我想知道:第一个命令到底是做什么的?我知道基本的 bash 重定向,例如>或 ,2>&1但事实上有如此多的嵌套重定向(exec > >, -s 2>dev/console)让我失去了理智。

以下是我认为逐步解释的方式:

  1. 所以我们到了2>&1最后。这意味着copy stdout to stderr。这在以后很重要。
  2. exec > >。什么?我知道>file是 的别名1>file。那么这基本上是吗exec 1>1>(tee ...| logger ...)?那为什么不呢exec>(tee ...|logger...)

  3. exec > >(tee /var/log-user-data.log|logger -t user-data -s 2>/dev/console)
    括号(tee ...|logger ...)从 exec 接收 stdout 并将其放入文件中。问题是 tee 应该从 stdin 读取并输出到文件。但这里我们只将其传递给标准输出。基本上是这样吗1|tee file?我知道管道不能与这样的描述符 id 一起使用。

  4. Tee 获取标准输出并将其打印到记录器的标准输入。然后记录器描述符“2”(包含 stdin 和 stderr)到 /dev/console。但为什么要管道呢? logger 已经可以访问描述符编号 2 中的 stdout。

相关内容