Linux:tee使用误区

Linux: tee usage misunderstanding

  1. 当我使用
$ ls | tee log.txt

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

  1. 我需要保存命令的输出:
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.

其中“$ svnadmin ..”是命令并且 “* Dumped ..”是输出

  1. 所以,问题本身。当我 运行 命令时:
$ svnadmin dump MyRepo -r1:r2 > dumpfile | tee log.txt
* Dumped revision 1.
* Dumped revision 2.

log.txt 有 0 个尺码

TL;DR -- 试试这个:

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.txt 会将 svnadmin 的 STDOUT 重定向到 dumpfile,实际上不会为 tee 命令留下任何数据,因为那是 重定向,不是 copy.

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

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

部分