我知道如何使用tee
写入aaa.sh
到bbb.out
的输出(standard output),同时仍在终端中显示:
./aaa.sh | tee bbb.out
我现在如何将standard error写入名为ccc.out
的文件,同时仍显示它?
我知道如何使用tee
写入aaa.sh
到bbb.out
的输出(standard output),同时仍在终端中显示:
./aaa.sh | tee bbb.out
我现在如何将standard error写入名为ccc.out
的文件,同时仍显示它?
我想你还是想在终端上看到STDERR和STDOUT.你可以 Select Josh Kelley的答案,但我发现在后台保留一个tail
,这样会输出你的日志(log)文件,非常粗糙和笨拙.请注意,你需要如何保存exra FD,并在事后通过杀死它来进行清理,从技术上讲,应该在trap '...' EXIT
中这样做.
有一种更好的方法,你已经发现了:tee
.
只是,不要只在stdout上使用它,而是为stdout和stderr分别准备一个T恤.你将如何做到这一点?进程替换和文件重定向:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
让我们分开来解释一下:
> >(..)
>(...)
(进程替换)创建一个FIFO,让tee
监听.然后,它使用>
(文件重定向)将command
的标准输出重定向到第一个tee
正在监听的FIFO.
第二点也是一样:
2> >(tee -a stderr.log >&2)
我们再次使用进程替换来生成一个tee
进程,该进程从STDIN读取数据并将其转储到stderr.log
中.tee
将其输入输出回STDOUT,但由于它的输入是我们的STDERR,所以我们想再次将tee
的STDOUT重定向到我们的STDERR.然后我们使用文件重定向将command
的STDERR重定向到FIFO的输入(tee
的STDIN).
见http://mywiki.wooledge.org/BashGuide/InputAndOutput
进程替换是一件非常可爱的事情,你可以 Select bash
作为shell,而不是sh
(POSIX或Bourne).
在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"