输出重定向是否按顺序写入stdout和stderr信息?

时间:2015-10-14 19:39:29

标签: linux shell io-redirection

我编写了一个程序capture,它输出了stdout消息以及stderr消息(即printf(),fprintf(stderr,..))

我希望打印信息显示在终端上并保存到日志文件中。

  ./capture 2>&1|tee log

但是我看到stdout和stderr消息似乎没有在日志文件中按顺序排列。

按顺序输出重定向写stdout和stderr信息? 如果没有,我该怎样做才能使它们按顺序排列?

1 个答案:

答案 0 :(得分:0)

输出重定向,因为它保持了write()次调用的顺序。重定向仅更改为进程保留的内核中的文件描述符结构,将值从fd1下复制到fd2

你的问题是*printf()缓冲输出批量调用一些write()。通常,不使用stderrline-buffering stdout的缓冲。但是当您将其重定向到管道时,它会切换到block缓存stdout,从而延迟输出(请参阅man stdout)。将缓冲模式设置为在开始时使用setlinebuf(stdout);手动排队,或在每fflush(stdout);后使用*printf()。或者只使用原始write()来电。您可以在man setlinebuf

中了解相关信息

实际上你可以在bash中使用|&进行重定向。查看关于man bash的{​​{1}}。