【问题标题】:Unix Shell File DescriptorsUnix Shell 文件描述符
【发布时间】:2018-12-26 12:52:39
【问题描述】:

我需要运行一个名为 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 是另一个指向标准输出的文件描述符。

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

【问题讨论】:

  • 您的代码摘录中的括号不平衡,您能否编辑您的问题?

标签: bash unix ksh file-descriptor


【解决方案1】:

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

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

| 输入则为 fd 3,而标准错误未被 tee 捕获,

嵌套重定向:

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

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

    因为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多