使用 tee 将 STDERR 和 STDOUT 捕获到文件

PP.*_*PP. 27 linux unix redirect pipe

我不清楚的最佳顺序是同时捕获什么STDERR,并STDOUT使用相同的文件tee。我知道如果我想通过管道传输到文件,我必须在重定向后映射文件句柄,即

find . >/tmp/output.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

这指示外壳发送STDOUT/tmp/output.txt然后发送STDERRSTDOUT(现在正在发送到/tmp/output.txt)。

尝试2>&1在重定向文件之前执行不会有预期的效果。

但是,当我想管道使用时,tee应该是:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?
Run Code Online (Sandbox Code Playgroud)

Mad*_*ter 30

后者; 它确保原始命令的 STDOUT 和 STDERR 进入同一个 fd,然后将它们一起送入 tee。在前一种情况下,您要加入其 STDOUT 的是 tee 命令的 STDERR。

  • 有趣的是bash手册页说,“如果使用`|&`,command1的标准错误通过管道连接到command2的标准输入;它是`2>&1 |`的简写。标准错误的这种隐式重定向是在命令指定的任何重定向之后执行。” (6认同)
  • 我必须创建一个小型 C 程序来写入“stderr”和“stdout”才能理解这个问题。当尝试捕获两个输出流时,重定向 `>` 和 tee `|` 运算符有所不同。对于重定向,我必须`./testapp > /tmp/out.log 2>&1`。而对于 tee,我必须 `./testapp 2>&1 | 三通/tmp/out.log`。 (4认同)