首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux: tee使用误区

Linux: tee使用误区
EN

Stack Overflow用户
提问于 2021-08-29 05:57:41
回答 1查看 125关注 0票数 1

当我使用

代码语言:javascript
复制
$ ls | tee log.txt

我得到了正确的,预期的结果: log.txt保持'ls‘输出。

  1. 我需要保存命令的输出:

代码语言:javascript
复制
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.

"$ svnadmin .“是命令和"*抛弃..“是产出

  1. 所以问题本身。当我运行命令时:

代码语言:javascript
复制
$ svnadmin dump MyRepo -r1:r2 > dumpfile | tee log.txt
* Dumped revision 1.
* Dumped revision 2.

log.txt的大小为0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-29 06:35:41

TL;博士--试试这个:

代码语言:javascript
复制
svnadmin dump MyRepo -r1:r2 2>&1 > dumpfile | tee log.txt

解释:每个命令都有三个连接的“标准流”:标准输入(STDIN,文件句柄0),标准输出(STDOUT,1)和标准错误(STDERR,2)。通常命令在STDOUT上输出他们的“数据”,在STDERR上输出错误。

ls这样的简单命令将所有三个命令都连接到控制台上。因为STDOUT和STDERR都连接到控制台,所以命令的输出是交错的。

类似于ls | tee log.txt的“管道”将第一个命令的STDOUT重定向到第二个命令的STDIN。不多-不少。因此,所有其他流仍然连接到控制台。如果ls部件产生错误消息,它们将被写入控制台,而不是写入文件!但是您的ls示例没有输出任何错误,因此您没有注意到。

设置管道后,shell计算第一个命令的另一个重定向操作符--从左到右。

因此,svnadmin dump > dumpfile | tee log.txtsvnadmin的STDOUT重定向到dumpfile,从而有效地为tee命令留下任何数据,因为这是重定向,而不是副本。

svnadmin dump MyRepo 2>&1 > dumpfile | tee log.txt添加了另一个重定向步骤。它读取“makefilehandle2 (STDERR)为文件句柄1(STDOUT)的副本”,即此时的管道。写入STDOUT或STDERR将写入管道。但在此之后,应用> dumpfile重定向,并将STDOUT重定向到文件。

您可以在shell的手册中阅读所有这些(以及更多)。对于bash,它在REDIRECTION一节中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68970255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档