前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >玩转tee命令 派发命令行的输出

玩转tee命令 派发命令行的输出

作者头像
程序熵
发布2023-09-25 11:02:09
发布2023-09-25 11:02:09
19000
代码可运行
举报
文章被收录于专栏:技术汇技术汇
运行总次数:0
代码可运行

问:

我知道如何使用tee将 aaa.sh 的输出(标准输出)写入 bbb.out,同时还在终端中显示:

代码语言:javascript
代码运行次数:0
复制
./aaa.sh | tee bbb.out

现在,我该如何将标准错误写入名为 ccc.out 的文件,同时显示它?

答:

tee -- 从标准输入读取内容,并将内容写到标准输出和文件。

语法

代码语言:javascript
代码运行次数:0
复制
tee [OPTION]... [FILE]...

参数

-a或--append -- 追加到给定的 FILEs,不要覆盖

-i或--ignore-interrupts -- 忽略中断信号

--help -- 显示此帮助并退出 --version -- 显示版本信息并退出

对于提问,一个优雅的解决办法是用一个 tee 处理标准输出,另一个 tee 处理标准错误。我们如何做到这一点呢?采用进程替换和文件重定向:

代码语言:javascript
代码运行次数:0
复制
command > >(tee -a stdout.log) 2> >(tee -a stderr.log >&2)

让我们把它分开解释一下:

代码语言:javascript
代码运行次数:0
复制
> >(..)

>(..) (进程替换)创建一个 FIFO 并让 tee 监听它。然后,它使用 >(文件重定向)将 command 的标准输出重定向到第一个 tee 正在监听的 FIFO。注意 > 和左括号之间不能出现空格,否则该结构将被解释为一个重定向。

第二个也是一样:

代码语言:javascript
代码运行次数:0
复制
2> >(tee -a stderr.log >&2)

我们再次使用进程替换来创建一个 tee 进程,该进程从标准输入读取数据,并将其转储到 stderr.log 中。tee 将其输入 输出回标准输出,但由于其输入是 command 的标准错误,我们希望将该 tee 的标准输出再次重定向到我们的标准错误。然后我们使用文件重定向将 command 的标准错误重定向到 FIFO 的输入(tee 的标准输入)。

另外,使用 tee 将一份输入派发给多个文件的示例如下:


参考:

  • stackoverflow question 692000
  • man tee
  • https://www.gnu.org/software/bash/manual/bash.html#Process-Substitution

相关阅读:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-05 09:05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档