使用tee捕获STDERR和STDOUT到文件


16

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

find . >/tmp/output.txt 2>&1

这指示外壳程序先发送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   # ?

Answers:


19

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


5
有趣的是,bash手册页说:“如果|&使用,则command1的标准错误通过管道连接到command2的标准输入;它是简写形式2>&1 |。标准错误的这种隐式重定向是在命令指定的任何重定向之后执行的。”
PP。

我必须创建一个小的C程序,该程序既要写入stderrstdout也要了解此问题。尝试捕获两个输出流时,重定向>和tee |运算符不同。为了重定向,我不得不./testapp > /tmp/out.log 2>&1。至于开球,我不得不./testapp 2>&1 | tee /tmp/out.log
typelogic

@daixtr的价值,|通常称为管道运算符。 tee仅指在管道远端被调用的特定程序。
MadHatter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.