将长标准输出插入tee命令有时会导致截断

问题描述 投票:3回答:1

在几个示例中,我可以看到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等待吗?谢谢:-)

linux bash shell tee
1个回答
3
投票

您遇到的问题可以简化为:

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

0
投票

这是滥用head的结果。试试:

seq 50000 | tee >(wc) >(head -n 2) >/dev/null

您将会看到。

© www.soinside.com 2019 - 2024. All rights reserved.