
我在 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