问:
我知道如何使用tee将 aaa.sh 的输出(标准输出)写入 bbb.out,同时还在终端中显示:
./aaa.sh | tee bbb.out
现在,我该如何将标准错误写入名为 ccc.out 的文件,同时显示它?
答:
tee -- 从标准输入读取内容,并将内容写到标准输出和文件。
语法
tee [OPTION]... [FILE]...
参数
-a或--append -- 追加到给定的 FILEs,不要覆盖
-i或--ignore-interrupts -- 忽略中断信号
--help -- 显示此帮助并退出 --version -- 显示版本信息并退出
对于提问,一个优雅的解决办法是用一个 tee 处理标准输出,另一个 tee 处理标准错误。我们如何做到这一点呢?采用进程替换和文件重定向:
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)
让我们把它分开解释一下:
> >(..)
>(..) (进程替换)创建一个 FIFO 并让 tee 监听它。然后,它使用 >(文件重定向)将 command 的标准输出重定向到第一个 tee 正在监听的 FIFO。注意 > 和左括号之间不能出现空格,否则该结构将被解释为一个重定向。
第二个也是一样:
2> >(tee -a stderr.log >&2)
我们再次使用进程替换来创建一个 tee 进程,该进程从标准输入读取数据,并将其转储到 stderr.log 中。tee 将其输入 输出回标准输出,但由于其输入是 command 的标准错误,我们希望将该 tee 的标准输出再次重定向到我们的标准错误。然后我们使用文件重定向将 command 的标准错误重定向到 FIFO 的输入(tee 的标准输入)。
另外,使用 tee 将一份输入派发给多个文件的示例如下:
参考:
相关阅读: