在管道中使用T形三通时,如何将标准错误写入文件? [英] How do I write standard error to a file while using "tee" with a pipe?

查看:17
本文介绍了在管道中使用T形三通时,如何将标准错误写入文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道如何使用teeaaa.sh的输出(standard output)写到bbb.out,同时仍然在终端显示:

./aaa.sh | tee bbb.out

我现在如何将standard error写入名为ccc.out的文件,同时仍显示该文件?

推荐答案

我假设您仍然希望在终端上看到STDERR和STDOUT。你可以去找Josh Kelley的答案,但是我发现在后台放一个tail输出你的日志文件是很麻烦的。请注意,您需要保留exra fd,然后通过杀死它来进行清理,从技术上讲,应该在trap '...' EXIT中这样做。

有一种更好的方法,您已经发现了:tee

仅将其用于标准输出,而不是仅将其用于标准输出,而是为标准输出和标准错误分别设置一个TEE。您将如何实现这一目标?进程替换和文件重定向:

command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)

我们分开解释一下:

> >(..)

>(...)(进程替换)创建一个FIFO并让tee监听它。然后,它使用>(文件重定向)将command的STDOUT重定向到您的第一个tee正在监听的FIFO。

第二个也一样:

2> >(tee -a stderr.log >&2)
我们再次使用进程替换来创建一个从STDIN读取并将其转储到stderr.log中的tee进程。tee将其输入输出回STDOUT,但由于其输入是我们的STDERR,因此我们要再次将tee的STDOUT重定向到我们的STDERR。然后,我们使用文件重定向将command的STDERR重定向到FIFO的输入(tee的STDIN)。

参见http://mywiki.wooledge.org/BashGuide/InputAndOutput

进程替换是选择bash而不是sh(POSIX或Bourne)作为shell的额外奖励之一。


sh中,您必须手动操作:

out="${TMPDIR:-/tmp}/out.$$" err="${TMPDIR:-/tmp}/err.$$"
mkfifo "$out" "$err"
trap 'rm "$out" "$err"' EXIT
tee -a stdout.log < "$out" &
tee -a stderr.log < "$err" >&2 &
command >"$out" 2>"$err"

这篇关于在管道中使用T形三通时,如何将标准错误写入文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆