将输出和错误流写入同一个文件

将输出和错误流写入同一个文件

在 Unix/Linux 中,您可以使用管道将输出和错误流写入文件。人们甚至可以将它们写入同一个文件。有没有办法将两者都写入文件但保持顺序。这个说法:

swipl -s jobshop.chr < CHRInput > output 2> output

确实会生成一个名为“output”的文件,其中包含输出流和错误流(通常这是控制台与用户的交互)。但输出流是在错误流之前写入的(使用交互式控制台时会产生错误和输出流交错)。

答案1

对于bash,

swipl -s jobshop.chr < CHRInput &> output

答案2

swipl -s jobshop.chr < CHRInput > output 2>&1

2>&1表示“将文件描述符 2(标准错误)重定向到连接到的文件描述符 1(标准输出)”。请注意,2>&1必须在标准输出重定向之后进行:2>&1 >output首先将 fd 2 发送到当时连接到的 fd 1(即终端),然后将 fd 1 重定向到终端。

请注意,根据程序的编写方式,这可能不会按照与在终端上运行时相同的顺序交错输出。那是因为很多节目缓冲标准输出上的输出,即它们仅在缓冲区已满时才实际写出数据。但是,当标准输出连接到终端时,它是行缓冲的,即即使缓冲区未满,每一行也会被写出。 (另一方面,Stderr 默认情况下不会缓冲。)因此,如果程序写入整行而不考虑刷新缓冲区或更改默认设置,并且您希望它们按顺序排列,无论它们是写入标准错误还是标准输出,重定向到文件可能不起作用。

在相当新的 Linux 系统上,如果重定向输出的行顺序不正确,请尝试

stdbuf -oL -oL swipl -s jobshop.chr <CHRInput >output 2>&1

相关内容