为什么 dd 在通过管道传输到 cat 时会立即完成?

为什么 dd 在通过管道传输到 cat 时会立即完成?

我在 Cygwin 上启动 bash 并输入:

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

它立即完成。当我输入:

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 应该在末尾写入 1000000000。问题是它在我的计算机上没有:

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

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

答案1

我想不出任何理由去做你正在尝试做的事情,但我想下面的方法就是你正在寻找的方法。

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

答案2

据我所知,你的第一个命令不起作用。你试图将 /dev/zero 的输出导入到不需要输入的命令中。

cat /dev/null只是一个不输出任何内容的命令。因此,在其中输入任何内容都不会产生任何效果。

当您使用 stdout 重定向时,/dev/zero 的输出将被写入相关文件(/dev/null 因此无处可去)。

答案3

作用dd if=/dev/zero | cat /dev/null是:

运行cat /dev/null将其 stdin 附加到ddstdout。问题是,它/dev/null是空的。因此cat执行要求的操作:打开空文件,将其内容写入 stdout 并完成。

cat仅当没有指定文件时才从 stdin 管道输出。cat /dev/null -将把 /dev/null 和 stdin 的内容管道到 stdout。

这样,dd if=/dev/zero | cat /dev/null除了浪费一个过程之外,与没有什么不同cat /dev/null

答案4

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

当我将tee输出发送到文件时,它全由零字节组成,但零字节太多了。

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

相关内容