当前位置: 首页 > 知识库问答 >
问题:

将stdout和stderr重定向到文件,将stderr重定向到屏幕,同时保留输出顺序

沃阳曜
2023-03-14

我想将stdout和stderr重定向到一个文件,同时保留输出顺序,然后还将stderr显示到屏幕上。我看到很多问题讨论它:

  • https://unix.stackexchange.com/questions/9646/show-only-stderr-on-screen-but-write-both-stdout-and-stderr-to-file
  • https://unix.stackexchange.com/questions/333198/bash-redirect-stderr-to-file-and-stdout-stderr-to-screen
  • https://unix.stackexchange.com/questions/364166/redirect-bash-stdoutstderr-to-one-file-and-stderr-to-another-file
  • 编写标准输出

但他们似乎都没有做我想做的事,也没有维护秩序。

我的测试脚本

#!/bin/bash

echo "1: good" >&1
echo "2: error" >&2
echo "3: error" >&2
echo "4: good" >&1
echo "5: error" >&2
echo "6: good" >&1
echo "7: error" >&2
echo "8: good" >&1
echo "9: error" >&2

到目前为止我所拥有的:

$ ./test.sh 2>&1 > output.log

共有1个答案

公良琛
2023-03-14

标准UNIX语义不允许这样做;仅使用bash中内置的或POSIX中指定的工具无法可靠地完成这项工作。

当写入发生在同一个目标上时,它们之间只有一个相互保证的顺序。一旦您将stdout和stderr重定向到不同的目的地,操作系统就不再提供对它们执行的写入顺序的保证;当这些写入到一个单独的进程(例如tee)时,该进程必须读取内容并执行自己的进一步写入,这取决于操作系统级的调度。

可以使用操作系统提供的(或可用于)系统调用级跟踪设施来生成系统调用的绝对顺序,从而生成确定顺序的输出;关于在不丢失顺序的情况下分别重定向和重新组合stderr/stdout的回答中给出了一个例子。

然而,使用bash本身,您只能控制子流程的文件描述符连接到哪里,而不能控制写入这些描述符的内容如何被缓冲和刷新,因此根本没有足够的控制来实现您所要求的内容,而不需要对写进行重新排序。

 类似资料:
  • 问题内容: 我在cyberciti.biz的评论中看到了这个有趣的问题。 我发现我什至找不到在sh的单行命令中执行此操作的灵活方法。 到目前为止,我对解决方案的想法是: 但是您会看到,这不是同步的,而且致命的是,它是如此丑陋。 欢迎与您分享这个想法。:) 问题答案: 你要 这里的顺序很重要。假设stdin(fd 0),stdout(fd 1)和stderr(fd 2)最初都连接到tty,因此 首先

  • 问题内容: 我想将子进程的stderr输出重定向到stdout。常量应该这样做,不是吗? 然而, 确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息? 问题答案: 仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导: 表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄 。 由于在求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认

  • 我有一个调用函数的PowerShell脚本。我正在努力实现所有这些,但不确定如何实现: 将标准输出写入控制台并输出。txt 将STDERR写入控制台并输出。txt和err。txt 确保所有STDOUT和STDERR输出仍按其生成的顺序 这就是我到目前为止所拥有的将STDOUT和STDERR写入文件的功能,但它不能完成我需要的其余部分。

  • 问题内容: 要将 stdout 重定向到Bash中的截断文件,我知道使用: 为了重定向Bash中的 stdout ,将其附加到文件中,我知道要使用: 要将 stdout 和 stderr 都重定向到截断的文件,我知道使用: 如何将 stdout 和 stderr 都重定向到文件?没有为我工作。 问题答案: Bash执行从左到右的重定向,如下所示: :以追加模式打开并在那里重定向。 :重定向到 “当

  • 问题内容: 我很了解: 有什么方法可以将stderr输出到错误文件,并在bash的同一行中将stdout输出到输出文件? 问题答案: 只需将它们添加到一行中 但是,请注意,如果文件已经有数据,则用于追加。而将覆盖文件中的所有现有数据。 因此,如果您不想附加。 仅出于完成的缘故,您可以编写,因为默认文件描述符是输出。所以,是同一回事。 因此,成为

  • 我希望能够从子进程中独立读取stdout/stderr(以及我正在介绍的一个新的stdlog),对这些流做一些事情,并以相同的顺序将它们写入屏幕和日志文件。 例如,如果子进程想对stdout说“aa”,然后对stderr说“bb”,然后再对stdout说“cc”,我想在屏幕上看到“aabbcc”。如果我看到“aaccbb”,我可以容忍它(我想这是没办法的),但我肯定不想看到“aacbbc”(用一个