我知道可以将两者都重定向到特定文件:
./command 1> out.log 2> err.log
或
./command 1>test.log 2>&1
将两者都写入文件。但是我不知道同时打印两个文件到同一文件(保留输出顺序)的方法。 tee
并不是很有帮助,因为它会同时打印两个文件描述符。
答案 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
的管道。 foo
将tee stderr.log
标准错误复制到该描述符,2>&1
将tee'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
表示交换标准输出和标准错误