所以,假设我有一个这样的脚本。
log_files=(output_{console,stdout,stderr}.log)
do_stuff 2>"${log_files[2]}" 1>"${log_files[1]}"
虽然函数应该将 stdout 重定向到"${log_files[1]}"
stderr 到"${log_files[2]}"
,但我还希望"${log_files[0]}"
同时将 stdout 和 stderr 重定向到。如何才能做到这一点?
所以,假设我有一个这样的脚本。
log_files=(output_{console,stdout,stderr}.log)
do_stuff 2>"${log_files[2]}" 1>"${log_files[1]}"
虽然函数应该将 stdout 重定向到"${log_files[1]}"
stderr 到"${log_files[2]}"
,但我还希望"${log_files[0]}"
同时将 stdout 和 stderr 重定向到。如何才能做到这一点?
这在 zsh 中会容易得多,
multios
如果在同一个 fd 上有多个重定向,shell 会执行一些内部魔法将输出发送到所有目的地,例如:(请注意,由于处理重复输出的中间过程,stdout 和 stderr 的输出之间的顺序可能会混淆。)
球座
回想一下,它
echo "foo" | tee --append log.txt
要求tee 将“foo”发送到文件和文件描述符 1。这会将“foo”放入一对文件中:
因此,您可以重定向到一对子外壳,每个子外壳都将传入的文本记录到一对文件中。
命名管道
如果您需要更大的灵活性,您可以选择创建命名管道,然后对结果应用任意逻辑。
将文件描述符 1 和 2 发送给它们,就像您已经在做的那样。在另一个终端选项卡中,或在后台守护程序中,运行或其道德等价物以实时从每个FIFO
tail -f
中检索文本行。用正则表达式过滤,用时间戳修饰,随心所欲,然后将结果写入任意数量的接收器。或者,要在没有命名管道的情况下执行此操作,您可以使用此问题的答案: https: //stackoverflow.com/questions/16497317/piping-both-stdout-and-stderr-in-bash
将 stdout 和 stderr 分别通过管道传输到它们自己的 tee 副本,它们都附加到同一个文件,并写入所需的各个文件。
然而,并非所有 tee 的实现都能安全地执行此操作,因此在某些情况下,您最终可能会在“both”文件中奇怪地散布 stdout 和 stderr 块。
据我所知,tee 没有办法强制使用基于行的安全缓冲。