Unix Shell文件描述符

时间:2018-12-26 12:52:39

标签: bash unix ksh file-descriptor

我需要运行一个名为pg.sh的程序。它将stdout报告到输出日志。如何将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是另一个指向stdout的文件描述符。

上面的代码可以正常工作,但是我不知道该如何实现。有人可以帮我编写代码吗?

1 个答案:

答案 0 :(得分:5)

从外部重定向( .. ) 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