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

时间:2019-01-21 00:00:30

标签: bash stdout stderr io-redirection

我想将stdout和stderr重定向到一个文件,同时保留输出顺序,但是还要在屏幕上显示stderr。我看到很多问题对此进行讨论:

但是他们似乎都没有做我想要的事情或保留订单。

我的测试脚本:

#!/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 个答案:

答案 0 :(得分:1)

标准UNIX语义不允许这样做。只能使用bash内置的功能或POSIX中指定的功能可靠地完成

只有当它们碰到相同的目的地时,它们之间的关系才有保证。一旦将stdout和stderr重定向到不同的目的地,操作系统就不再为围绕它们执行的写入顺序提供保证。当这些写操作进入一个单独的进程(例如tee)时,它必须加倍,然后必须读取内容并执行自己的进一步写操作,并遵守操作系统级别的调度。

可能可以使用操作系统提供的(或可用于)操作系统调用级别的跟踪功能来生成系统调用的绝对顺序,从而生成确定顺序的输出; Separately redirecting and recombining stderr/stdout without losing ordering的答案中给出了一个示例。

但是,使用bash本身,您只能控制子进程的文件描述符的连接位置,而不能控制写入和写入这些描述符的内容的缓冲和刷新方式,因此根本没有足够的控件来满足您的要求无需重新排序就可以实现。