我在 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 附加到dd
stdout。问题是,它/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