為什麼 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

AFAIK,你的第一個指令不起作用。您正在嘗試將 /dev/zero 的輸出透過管道傳輸到不含輸入的命令中。

cat /dev/null只是一個不輸出任何內容的命令。因此,將任何東西放入其中根本不會起任何作用。

當您使用 stdout 重定向時, /dev/zero 的輸出將被寫入有問題的檔案(/dev/null 因此無處可寫入)。

答案3

所做dd if=/dev/zero | cat /dev/null的是:

運行cat /dev/null將其標準輸入附加到dd標準輸出。問題是,那/dev/null是空的。cat要求執行的操作也是如此:打開空文件,將其內容寫入標準輸出並完成。

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 上運行。我想說這是一個錯誤。

當我執行 atee將輸出發送到文件時,它由全零位元組組成,但它們太多了。

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

相關內容