如何将stdout和stderr重定向到文件并显示stderr到控制台?

TWiStErRob

我知道如何重定向到文件,并使用tee;在基本水平上。所以

$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.

$ outanderr 1>file      # redirect stdout to a file, display stderr
stderr

$ outanderr 2>file      # redirect stderr to a file, display stdout
stdout

$ outanderr 1>file 2>&1 # redirect both to a file, display nothing

$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout

$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr

问题是:用什么代替问号可以得到下面的输出:

$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr

内容:

  • 假设重击。
  • 订单应保存在文件中。
  • stderr的内容逐行实时显示,即没有缓冲。
  • 可以使用单独的脚本文件。
  • 魔术可能是必要的。
豪克
2>&1 >>outputfile | tee --append outputfile

为了方便测试:

echo -n >outputfile; bash -c "echo stdout >&1; echo stderr >&2" 2>&1 >>outputfile |
  tee --append outputfile; echo "outputfile:"; cat outputfile

编辑1:

这是通过(仅)将stdout写入文件,使sterr stdout使其通过管道并让tee将其输出写入同一文件来实现的。

两次写入都必须在附加模式下(>>而不是>完成,否则两者都将覆盖彼此的输出。

由于管道是缓冲区,因此无法保证输出以正确的顺序出现在文件中。如果将应用程序连接到两个文件描述符(两个管道),这甚至都不会改变。为了保证顺序,两个输出都必须经过相同的通道并分别进行标记。否则,您将需要一些真正有趣的东西:

  1. 如果将stdout和stderr都重定向到一个文件(不是同一文件!),并且两个文件都在FUSE卷上,则FUSE模块可以用时间戳标记每个单写操作,以便第二个应用程序可以正确地对数据进行排序并将其合并用于实际的输出文件。或者,您不标记数据,而是让模块创建组合的输出文件。很可能还没有FUSE模块可以执行此操作...
  2. stdout和stderr都可以定向到/dev/null通过运行该应用程序,可以将其输出分开strace -f -s 32000 -e trace=write在这种情况下,您将不得不转义。不用说,通过跟踪应用程序不会运行得更快。
  3. 通过使用现有的简单FUSE模块并跟踪该模块而不是应用程序,也许可以达到相同的目的。这可能比跟踪应用程序更快,因为(或更确切地说:如果)该模块的系统调用可能比应用程序少得多。
  4. 如果可以修改应用程序本身:可以在每次输出后停止该应用程序(但我认为仅在内部可以这样做),并且仅在接收到s信号(SIGUSR1或SIGCONT)后继续运行。从管道读取的应用程序必须检查管道和文件中是否有新数据,并在每个新数据之后发送信号。根据应用程序的类型,它可能比strace方法更快或更慢。FUSE将是最高速度的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将STDERR重定向到文件和控制台,以及如何将STDOUT重定向到仅文件

来自分类Dev

将后台作业的stdout / stderr从控制台重定向到日志文件?

来自分类Dev

如何将stderr和stdout重定向到不同的文件并在终端中显示?

来自分类Dev

如何将stderr和stdout重定向到不同的文件并在终端中显示?

来自分类Dev

将stdout和stderr重定向到文件,并将stderr重定向到stdout

来自分类Dev

将stdout和stderr重定向到文件,并将stderr重定向到stdout

来自分类Dev

当stdout和stderr都重定向到/ dev / null时,GnuPG如何输出到控制台

来自分类Dev

如何将stderr和stdout重定向到同一文件

来自分类Dev

如何将bst脚本中的stdout和stderr都重定向到文件?

来自分类Dev

将clangd stderr重定向到文件而不是控制台

来自分类Dev

如何将Shell脚本stdout / stderr打印到文件和控制台

来自分类Dev

如何将错误输出重定向到stdout和stderr?

来自分类Dev

Linux:如何将stdout和stderr重定向到记录器?

来自分类Dev

如何将部分stderr和stdout重定向到/ dev / null

来自分类Dev

在fileinput循环中时如何将stdout仅重定向到控制台

来自分类Dev

bash:将stderr重定向到文件,将stdout + stderr重定向到屏幕

来自分类Dev

如何将stdout重定向到文件,以及如何将stdout + stderr重定向到另一个文件?

来自分类Dev

我如何将流程的stdout,stderr和stdin重定向到Groovy中的文件,以及从Bash shell中重定向文件?

来自分类Dev

如何将输出从交互式Perl脚本重定向到文件和控制台?

来自分类Dev

永久将stderr重定向到stdout

来自分类Dev

将stdout和stderr一起重定向VS重定向stdout,然后将stderr重定向到stdout的文件

来自分类Dev

如何将telnet控制台日志重定向到文件linux

来自分类Dev

如何将命令的控制台输出重定向到文件?

来自分类Dev

如何将命令的控制台输出重定向到文件?

来自分类Dev

如何将控制台输出重定向到文件?

来自分类Dev

如何将printf()重定向到文件,然后再返回到控制台

来自分类Dev

在C ++中将stdout和stderr重定向到单个文件

来自分类Dev

stdout和stderr重定向到不同的文件

来自分类Dev

将子进程的stdout / stderr重定向到文件

Related 相关文章

  1. 1

    如何将STDERR重定向到文件和控制台,以及如何将STDOUT重定向到仅文件

  2. 2

    将后台作业的stdout / stderr从控制台重定向到日志文件?

  3. 3

    如何将stderr和stdout重定向到不同的文件并在终端中显示?

  4. 4

    如何将stderr和stdout重定向到不同的文件并在终端中显示?

  5. 5

    将stdout和stderr重定向到文件,并将stderr重定向到stdout

  6. 6

    将stdout和stderr重定向到文件,并将stderr重定向到stdout

  7. 7

    当stdout和stderr都重定向到/ dev / null时,GnuPG如何输出到控制台

  8. 8

    如何将stderr和stdout重定向到同一文件

  9. 9

    如何将bst脚本中的stdout和stderr都重定向到文件?

  10. 10

    将clangd stderr重定向到文件而不是控制台

  11. 11

    如何将Shell脚本stdout / stderr打印到文件和控制台

  12. 12

    如何将错误输出重定向到stdout和stderr?

  13. 13

    Linux:如何将stdout和stderr重定向到记录器?

  14. 14

    如何将部分stderr和stdout重定向到/ dev / null

  15. 15

    在fileinput循环中时如何将stdout仅重定向到控制台

  16. 16

    bash:将stderr重定向到文件,将stdout + stderr重定向到屏幕

  17. 17

    如何将stdout重定向到文件,以及如何将stdout + stderr重定向到另一个文件?

  18. 18

    我如何将流程的stdout,stderr和stdin重定向到Groovy中的文件,以及从Bash shell中重定向文件?

  19. 19

    如何将输出从交互式Perl脚本重定向到文件和控制台?

  20. 20

    永久将stderr重定向到stdout

  21. 21

    将stdout和stderr一起重定向VS重定向stdout,然后将stderr重定向到stdout的文件

  22. 22

    如何将telnet控制台日志重定向到文件linux

  23. 23

    如何将命令的控制台输出重定向到文件?

  24. 24

    如何将命令的控制台输出重定向到文件?

  25. 25

    如何将控制台输出重定向到文件?

  26. 26

    如何将printf()重定向到文件,然后再返回到控制台

  27. 27

    在C ++中将stdout和stderr重定向到单个文件

  28. 28

    stdout和stderr重定向到不同的文件

  29. 29

    将子进程的stdout / stderr重定向到文件

热门标签

归档