Unix外壳文件描述符



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

我搜索得到了以下代码

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

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

上面的代码运行良好,但我不明白这是如何实现的。有人能帮我写代码吗?

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

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

|输入是fd 3,而stderr不是由tee、捕获的

嵌套重定向:

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

  • fd 1被重定向到fd 3(它被重定向到外部stdout)

    由于tee复制了记录的输出,(最终重定向>final.log 2>&1,因为fd 2在fd 1之后打开,所以它们都重定向到final.log)文件final.log将包含程序stdout和stderr,但output.log仅包含stdout。

也许它可以更容易地编写,使用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

相关内容

  • 没有找到相关文章

最新更新