在 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