这是这个问题的后续问题:
How do I get both STDOUT and STDERR to go to the terminal and a log file?
简而言之:我想运行一个命令,并将STDOUT
* 和 * STDERR
存储在 * 一个 * 日志文件中(以保持时间相关性),但我仍然需要在STDERR
上打印STDERR
输出。
动机:有一些工具运行一个命令,并以不同的方式处理STDOUT
和STDERR
-例如,以不同的颜色打印STDERR
,或者当命令返回非零值时打印STDERR
。
因此,我希望有一种方法可以将所有输出存储在一个日志文件中,同时保留STDOUT
和STDERR
之间的区别(以及返回代码)。
log-output --file=command.log -c "make stuff-with-stderr"
从我发现在上述链接的答案至少有两种不同的方法:
the_cmd 1> >(tee stdout.txt ) 2> >(tee stderr.txt >&2 )
会将STDOUT
和STDERR
储存在不同的档案中,因此会失去时间相关性。不幸的是,STDOUT
和STDERR
都只会打印在STDOUT
上。
script -e -B build.log -c "the_cmd"
将STDOUT
和STDERR
存储在 * 一个 * 文件中,保持时间相关性,但仍仅在STDOUT
上打印STDOUT
和STDERR
。
所以这些方法都不符合我的要求。还有别的吗?
1条答案
按热度按时间jpfvwuh41#
编辑:
在bash shell中使用我的方法和下面注解中的命令(
pip3 install -U pytest
),您可以得到想要的结果:log.txt
中的条目总是按照正确的顺序(与在终端中执行pip3 install -U pytest
相同),并且输出被正确地打印到终端(stdout和stderr的单独流)。我怀疑存在更好的解决方案,但这似乎是解决该问题的“可行”解决方案。原始答案:
可能还有一个比这个更简单的解决方案,但是你可以把stdout转换成log.txt,然后把stdout和stderr交换,把“新的”stdout(stderr)转换成log.txt,然后把stderr和stdout交换回来,然后把两个流都输出到终端(类似于here的例子):