gpt4 book ai didi

Bash:在保留顺序和出处的同时记录标准输出和标准错误

转载 作者:行者123 更新时间:2023-12-05 03:15:23 24 4
gpt4 key购买 nike

将命令的标准输出和标准错误记录到日志文件相当简单:

./foo.sh &> log.txt

问题是在检查日志文件时,人们不再知道哪一行来自哪个流。这可以通过将 stdout 和 stderr 重定向到两个单独的文件来解决,但随后输出的时间顺序和交错将丢失。

另一个解决方案是重定向到三个文件。一种是 stdout,一种是 stderr,另一种是两者结合。像这样的东西:

./foo.sh 2> >(tee stderr | tee -a combined) 1> >(tee stdout | tee -a combined)

但是拥有这么多文件并不是很优雅(并且此命令仍将输出的副本转储到 shell 上)。

我发现了一个有趣的 bash 函数,它只会将 stderr 消息着色为红色:

color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1

但它不会保留输出的顺序,并且结果在文本编辑器中不可读。给定以下 foo.sh 程序:

for i in 1 2; do
for j in 1 2; do
printf '%s\n' "out $i"
done
for k in 1 2; do
printf '%s\n' "err $i" >&2
done
done

运行 color ./foo.sh 产生:

out 1
out 1
out 2
out 2
[31merr 1[m
[31merr 1[m
[31merr 2[m
[31merr 2[m

一个人怎么可能轻易地在单个日志文件中得到这样的东西?

@| out 1
@| out 1
$| err 1
$| err 1
@| out 2
@| out 2
$| err 2
$| err 2

最佳答案

也许您正在寻找脚本它记录 stdout、stderr 和命令...它启动一个新的 shell,在其中记录所有内容(或使用 -c _cmd_)

 $ script tx1

您的 color() 函数打乱了顺序,因为 sed 正在缓冲...

关于Bash:在保留顺序和出处的同时记录标准输出和标准错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com