当我使用
$ ls | tee log.txt我得到了正确的,预期的结果: log.txt保持'ls‘输出。
$ svnadmin dump MyRepo -r1:r2 > dumpfile
* Dumped revision 1.
* Dumped revision 2."$ svnadmin .“是命令和"*抛弃..“是产出
$ svnadmin dump MyRepo -r1:r2 > dumpfile | tee log.txt
* Dumped revision 1.
* Dumped revision 2.log.txt的大小为0
发布于 2021-08-29 06:35:41
TL;博士--试试这个:
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命令留下任何数据,因为这是重定向,而不是副本。
svnadmin dump MyRepo 2>&1 > dumpfile | tee log.txt添加了另一个重定向步骤。它读取“makefilehandle2 (STDERR)为文件句柄1(STDOUT)的副本”,即此时的管道。写入STDOUT或STDERR将写入管道。但在此之后,应用> dumpfile重定向,并将STDOUT重定向到文件。
您可以在shell的手册中阅读所有这些(以及更多)。对于bash,它在REDIRECTION一节中。
https://stackoverflow.com/questions/68970255
复制相似问题