我最近正在搞乱一个 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
)让我失去了理智。
以下是我认为逐步解释的方式:
- 所以我们到了
2>&1
最后。这意味着copy stdout to stderr
。这在以后很重要。 exec > >
。什么?我知道>file
是 的别名1>file
。那么这基本上是吗exec 1>1>(tee ...| logger ...)
?那为什么不呢exec>(tee ...|logger...)
?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 一起使用。Tee 获取标准输出并将其打印到记录器的标准输入。然后记录器描述符“2”(包含 stdin 和 stderr)到 /dev/console。但为什么要管道呢? logger 已经可以访问描述符编号 2 中的 stdout。