繁体   English   中英

如何将 STDOUT 和 STDERR 都发送到终端和日志文件 go - 并保留 stdout/stderr?

[英]How do I get both STDOUT and STDERR to go to the terminal and a log file - and preserve stdout/stderr?

这是这个问题的后续行动:

如何将 STDOUT 和 STDERR 都发送到 go 到终端和日志文件?

简而言之:我想运行一个命令并将STDOUTSTDERR存储在一个日志文件中(以保持时间相关性),但我需要STDERR output 仍然打印在STDERR上。

动机:有一些工具可以运行命令并以不同方式处理STDOUTSTDERR - 例如,以不同颜色打印STDERR或在命令返回非零值时打印STDERR

所以我想有一种方法可以将所有 output 存储在一个日志文件中,但保留STDOUTSTDERR之间的区别(以及返回代码)。

log-output --file=command.log -c "make stuff-with-stderr"

根据我在上述链接中找到的答案,至少有两种不同的方法:

the_cmd 1> >(tee stdout.txt ) 2> >(tee stderr.txt >&2 )

STDOUTSTDERR存储在单独的文件中,从而失去时间相关性。 不幸的是, STDOUTSTDERR都只会打印在STDOUT上。

script -e -B build.log -c "the_cmd"

STDOUTSTDERR存储在一个文件中,保持时间相关性,但仍然仅在STDOUT上打印STDOUTSTDERR

所以这些方法都不符合我的要求。 还有别的吗?

编辑:

在 bash shell 中使用我的方法和您在下面的评论 ( pip3 install -U pytest ) 中的命令,您会得到想要的结果:

(((pip3 install -U pytest | tee -a log.txt) 3>&1 1>&2 2>&3 | tee -a log.txt) 3>&1 1>&2 2>&3)

log.txt中的条目始终以正确的顺序排列(与在终端中执行pip3 install -U pytest相同)并且 output 正确打印到终端(stdout 和 stderr 的单独流)。 我怀疑存在更好的解决方案,但这似乎是该问题的“可行”解决方案。


原答案:

可能有比这更简单的解决方案,但您可以将 stdout 连接到 log.txt,然后将 stdout 与 stderr 交换并将“新”stdout (stderr) 连接到 log.txt,然后将 stderr 换回 stdout,然后打印两个流到终端(类似于此处的示例):

((({ echo "test_out"; echo "test_err" 1>&2; } | tee -a log.txt) 3>&1 1>&2 2>&3 | tee -a log.txt) 3>&1 1>&2 2>&3)
test_out
test_err

cat log.txt
test_out
test_err

# show stdout/stderr are still separate streams:
((({ echo "test_out"; echo "test_err" 1>&2; } | tee -a log.txt) 3>&1 1>&2 2>&3 | tee -a log.txt) 3>&1 1>&2 2>&3) 1>std.out 2>std.err

cat std.out
test_out

cat std.err
test_err

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM