将stdout和stderr写入日志文件时,是否可以仅将stdout打印到屏幕上?

时间:2020-04-11 00:40:18

标签: bash io io-redirection

我知道可以将两者都重定向到特定文件:

./command 1> out.log 2> err.log

./command 1>test.log 2>&1

将两者都写入文件。但是我不知道同时打印两个文件到同一文件(保留输出顺序)的方法。 tee并不是很有帮助,因为它会同时打印两个文件描述符。

5 个答案:

答案 0 :(得分:2)

使用Ktor将标准输出写到一个文件,再写到另一个文件是很简单的:

tee

compound命令的两个描述符都重定向到{ cmd | tee stdout.log; } &> both.log ,但是both.log的标准输出首先通过cmd传递到tee,然后再写入{{ 1}}。

将标准错误写给一个错误,将两个错误都写给另一个错误。

stdout.log

正确描述有点棘手。首先,将忽略命令组的标准错误。它的标准输出是到both.log的管道。但是{ foo 2>&1 1>&3 | tee stderr.log ; } 3>&1 | tee both.log > /dev/null 还将其fd 3复制到其标准输出中。因此,问题是,该怎么写?

在命令组中,tee both.log的标准输出是到3>&1的管道。 footee stderr.log标准错误复制到该描述符,2>&1tee's标准输出复制到继承的fd 3。

答案 1 :(得分:1)

最好将它们写入不同的文件,在这种情况下,这将非常容易:

cmd 2>/stderr.log| tee -a stdout.log

但是,如果您只需要一个文件,则需要一些技巧,并且需要运行其他过程来进行重定向。

答案 2 :(得分:1)

您可以使用多个重定向:

foo () { echo 1 ; echo 2 >&2 ; }
(( foo | tee >(cat) >&3) &>log ) 3>&1

tee命令将stdout发送到文件描述符1(通过进程替换)和3。stdout和stderr都重定向到日志。最后,将3(stdout的副本)发送回终端。

或者,您可以不进行进程替换而直接将输出重定向到日志,但是可以使用-a>>进行追加。您需要事先清除日志。

: > log; (( foo | tee -a log >&3) 2>> log ) 3>&1

答案 3 :(得分:1)

stdout到控制台,stdout和错误到文件?

{ cmd | tee /dev/tty; } &> /tmp/both.log

答案 4 :(得分:1)

回答问题:

stderr到控制台,stdout和错误到文件?

{ cmd 3>&1 1>&2 2>&3 | tee /dev/tty; } &> /tmp/both.log

3>&1 1>&2 2>&3表示交换标准输出和标准错误

相关问题