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

Bash 如何将不断变化的stderr附加到文件或stdout中,bash,shell,curl,Bash,Shell,Curl,我可能无法正确地表达我的搜索,但我无法找到任何方法来收集stderr/stdout的所有值,以防它在执行过程中每秒都被覆盖 像top这样的命令没有问题,因为它会将一个新页面写入stdout以获得每秒的统计数据,但在某些情况下,如curl,进度显示在stderr中,并且每秒都会被覆盖,我找不到一种方法来收集协议分析所需的stderr的所有每秒值 要添加更多详细信息,请执行以下操作: $ curl -o /dev/null --trace-ascii trace --trace-time ht

我可能无法正确地表达我的搜索,但我无法找到任何方法来收集
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
上,但每秒都会被覆盖。即使将其附加到文件中,该文件也只包含命令终止前的最后一个值,而我希望该文件包含每秒所有值的列表。 我读了《男人卷发》的每一行,想看看是否有可能发生这样的事情,但也许这不是我应该看的地方。任何帮助/重定向都将不胜感激


非常感谢。

输出包含
$'\r'
字符,该字符将光标移回行的开头。只要在文件中用换行符替换它,您就会看到所有的行

sed -i~ 's/\r/\n/g' input
sed
需要读取整个“行”以生成输出,因此如果不想等到最后,请切换到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/'

因此,在执行
curl
的过程中,您需要编写一些连续的命令来执行此替换。如果您想动态过滤输出,只需将
sed
插入管道:
curl。。。2> &1 | sed's/\r/\n/g'
。很好!最好说
sed's/\r/\n/g'
,这样每一行都出现在不同的行中,而不是所有的行都出现在一起。
curl-o/dev/null--trace ascii trace--trace timehttp://cachefly.cachefly.net/10mb.test 2> &1 | sed's/\r//g'
什么也不给。因为我是个业余爱好者,所以我也试着用新行替换它,并使用不同的引用方式,但没有任何效果。@Donbhupi:奇怪。它适合我(注意
\n
以获得更好的输出)。您必须等到结束,因为sed需要行的结尾来处理输入。