在几个示例中,我可以看到tee不会等待stdout完成,这会导致某些错误行为。第一个例子:seq 50000|tee >(wc) >(head -2) >/dev/null
将输出:
1
2
12773 12774 65536
代替
1
2
50000 50000 288894
第二个例子:cat f.txt|grep abc|tee f.txt >/dev/null
在此示例中,仅当文件较短时文件更新才有效,但是如果文件较长时文件更新则有时tee将在cat完成之前开始写入,并且文件更新仅适用于第一个“ cat”文件过渡。
您可以说tee仅用于重定向到文件,但是我也看到了tee的用法。我知道小便命令没有此错误,但是没有人知道解决办法让tee等待吗?谢谢:-)
您遇到的问题可以简化为:
seq 50000 | tee >(wc) >(exit) >/dev/null
如果写入tee
的流之一返回错误,则tee
终止。因为管道通常使用4K缓冲区进行缓冲,所以wc
足以抓取一些行并对其进行处理。
[head -n2
在打印两行后关闭流。
您可以通过告诉tee
在错误上打印一些内容来查看错误:
# seq 50000 | tee --output-error=exit >(wc) >(exit) >/dev/null
tee: /dev/fd/62: broken pipe
您可以删除-p
或--output-error=warn
的问题,以使tee
在写入管道时出现错误后继续:
seq 50000 | tee -p >(wc) >(head -n2) >/dev/null
或使用在处理输入后不会退出的命令,例如sed
:
seq 50000 | tee >(wc) >(sed -n '1,2p') >/dev/null
这是滥用head
的结果。试试:
seq 50000 | tee >(wc) >(head -n 2) >/dev/null
您将会看到。