Unix Shell 文件描述符

Unix Shell File Descriptors

我需要 运行 一个名为 pg.sh 的程序。它报告标准输出到输出日志。如何将 stdout 以及 stderr 和 stdout 保存到 2 个单独的日志文件中?

我搜索并得到以下代码

(pg.sh 2>&1 1>&3 ) 3>&1 1>&2 | tee output.log) > final.log 2>&1

我知道 1 和 2 是指向 stdout 和 stderr 的文件描述符。 3 是另一个指向标准输出的文件描述符。

上面的代码工作正常,但我不明白这是如何实现的。有人可以帮我写代码吗?

从外部重定向开始:( .. ) 3>&1 1>&2 ,顺序很重要:

  • fd 3 作为 1 的副本打开写入(标准输出:这里是管道输入)
  • 然后 fd 1 被压缩为 2 (stderr) 的副本(或重定向到 stderr)

| 输入然后是 fd 3,而 stderr 未被 tee 捕获,

嵌套重定向:

  • fd 2 被重定向到 stdout(被重定向到外部 stderr)

  • fd 1 被重定向到 fd 3(被重定向到外部标准输出)

    作为 tee 重复输出记录,(最终重定向 >final.log 2>&1,因为 fd 2 在 fd 1 之后打开,它们都被重定向到 final.log) 文件 final.log 将包含程序标准输出和标准错误,但 output.log 仅包含标准输出。

也许它可以写得更简单,使用 3>&1 1>&2 2>&3 反转 stdout 和 stderr。

以下也应该这样做:

( pg.sh | tee output.log ) >final.log 2>&1

下面将程序 stdout 写入 output.log stderr 到 error.log 并且都写入 final.log.

( ( pg.sh | tee output.log ) 3>&1 1>&2 2>&3 | tee error.log ) >final.log 2>&1