Linux:tee使用误区
Linux: tee usage misunderstanding
- 当我使用
$ ls | tee log.txt
我得到正确的预期结果:log.txt 保持 'ls' 输出。
- 我需要保存命令的输出:
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.
其中“$ svnadmin ..”是命令并且
“* Dumped ..”是输出
- 所以,问题本身。当我 运行 命令时:
$ 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
.
部分
- 当我使用
$ ls | tee log.txt
我得到正确的预期结果:log.txt 保持 'ls' 输出。
- 我需要保存命令的输出:
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2.
其中“$ svnadmin ..”是命令并且 “* Dumped ..”是输出
- 所以,问题本身。当我 运行 命令时:
$ 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
.