为什么当stream水线猫的时候,即时完成?

我开始在Cygwin上打bash:

dd if=/dev/zero | cat /dev/null 

它立即结束。 当我input:

 dd if=/dev/zero > /dev/null 

它按预期运行,我可以发出

 killall -USR1 dd 

看看进展情况。 为什么前面的调用马上就结束了? 在Linux上是一样的吗?

***解释为什么我问这个愚蠢的问题,可能不是那么愚蠢的问题

我正在压缩硬盘映像,有些压缩不正确。 我结束了以下脚本显示的问题:

 while sleep 1 ; do killall -v -USR1 dd ; done & dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd | wc -c 

Wc最后应该写10亿次。 问题是它不在我的机器上:

 bash-3.2$ dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd | wc -c 13+0 records in 12+0 records out 60000000 bytes (60 MB) copied, 0.834 s, 71.9 MB/s 27+0 records in 26+0 records out 130000000 bytes (130 MB) copied, 1.822 s, 71.4 MB/s 200+0 records in 200+0 records out 1000000000 bytes (1.0 GB) copied, 13.231 s, 75.6 MB/s 1005856128 

这是一个错误还是我再次做错了什么?

我想不出有什么理由去做你正在做的事情,但是下面的方法就是你正在寻找的方法。

  dd if=/dev/zero | cat > /dev/null 

AFAIK,你的第一个命令是不是function。 您正在尝试将/ dev / zero的输出传送到不接受input的命令。

cat /dev/null只是一个不输出的命令。 因此,pipe道内的任何东西都不会做任何事情。

在使用stdoutredirect时,/ dev / zero的输出将被写入相关文件(因此/ dev / null无处)。

什么dd if=/dev/zero | cat /dev/null dd if=/dev/zero | cat /dev/null的确是:

运行cat /dev/null将它的stdin附加到dd标准输出。 问题是, /dev/null是空的。 所以cat做什么被要求做:打开空文件写它的内容到标准输出并完成。

只有当没有指定文件时, cat才会从stdin输出pipe道。 cat /dev/null -会将/ dev / null和stdin的内容传递给stdout。

就像这样dd if=/dev/zero | cat /dev/null 除了浪费进程之外, dd if=/dev/zero | cat /dev/nullcat /dev/null没有任何区别。

我在Cygwin和Ubuntu上试了一下,在Ubuntu中得到了正确的结果。 如果我不发送信号到dd它在Cygwin上工作。 我要说这是一个错误。

当我做了一个tee的输出到一个文件,它包括所有的零字节,但有太多了。

 dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd | tee dd.out | wc -c