如何将不断变化的 stderr 附加到文件或 stdout

How to append constantly changing stderr to a file or stdout

我可能无法正确地表达我的搜索,但我找不到任何方法来收集 stderr/stdout 的所有值,以防它在执行的每一秒都被覆盖。

这不是像 top 这样的命令的问题,因为它会向 stdout 写入一个新页面以获取每秒统计信息,但在某些情况下,例如 curl,进度显示在stderr 并且它每秒都会被覆盖,我找不到一种方法来收集协议分析所需的 stderr 的所有每秒值。

要添加更多详细信息:

$ curl -o /dev/null --trace-ascii trace --trace-time    http://cachefly.cachefly.net/10mb.test
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
0 10.0M    0 65057    0     0  43039      0  0:04:03  0:00:01  0:04:02 43027^C

$ curl -o /dev/null --trace-ascii trace --trace-time http://cachefly.cachefly.net/10mb.test
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
13 10.0M   13 1376k    0     0   425k      0  0:00:24  0:00:03  0:00:21  425k^C

如您所见,stderr 显示在 stdout 上,但每秒都会被覆盖。即使我将它附加到一个文件,该文件只包含命令终止前的最后一个值,而我希望该文件包含所有每秒值的列表。 我已经阅读了 man curl 的每一行,看看是否有可能发生这样的事情,但也许那不是我应该看的地方。任何 help/redirection 将不胜感激!

感谢期待。

输出包含 $'\r' 字符,它将光标移回行首。只需将其替换为文件中的换行符,您就会看到所有行。

sed -i~ 's/\r/\n/g' input

sed 需要读取整个 "line" 来产生输出,所以如果你不想等到最后,切换到 Perl:

curl -o /dev/null --trace-ascii trace --trace-time http://cachefly.cachefly.net/10mb.test 2>&1 \
    | perl -pe 'BEGIN{$/="\r"}s/\r/\n/'