
Cygwin で bash を起動し、次のように入力します。
dd if=/dev/zero | cat /dev/null
すぐに終わります。次のように入力すると、
dd if=/dev/zero > /dev/null
期待通りに動作し、発行できます
killall -USR1 dd
進行状況を確認します。前者の呼び出しはなぜすぐに終了するのでしょうか? Linux ボックスでも同じですか?
*** なぜ私がこのような愚かな質問をしたのか、そしておそらくそれほど愚かではない質問をしたのかの説明
HDD イメージを圧縮していたのですが、一部は正しく圧縮されていませんでした。最終的に、問題を示す次のスクリプトが作成されました。
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 からの出力をパイプします。/dev/nullcat /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