Warum wird dd beim Pipelining an cat sofort beendet?

Warum wird dd beim Pipelining an cat sofort beendet?

Ich starte Bash auf Cygwin und gebe ein:

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

Es ist sofort fertig. Wenn ich Folgendes eingebe:

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

es läuft wie erwartet und ich kann

killall -USR1 dd

um den Fortschritt zu sehen. Warum wird der vorherige Aufruf sofort beendet? Ist das auf einer Linux-Box dasselbe?

*** Erklärung, warum ich so eine dumme Frage gestellt habe und möglicherweise auch eine nicht so dumme Frage

Ich habe Festplattenabbilder komprimiert und einige davon waren falsch komprimiert. Am Ende erhielt ich das folgende Skript, das das Problem zeigt:

while sleep 1 ; do killall -v -USR1 dd ; done &
dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  wc -c

Wc sollte am Ende 1000000000 schreiben. Das Problem ist, dass es das auf meinem Rechner nicht tut:

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

Ist das ein Fehler oder mache ich mal wieder etwas falsch?

Antwort1

Mir fällt kein Grund ein, das zu tun, was Sie versuchen, aber ich schätze, Sie suchen nach der folgenden Möglichkeit.

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

Antwort2

Soweit ich weiß, funktioniert Ihr erster Befehl nicht. Sie versuchen, die Ausgabe von /dev/zero in einen Befehl umzuleiten, der keine Eingabe akzeptiert.

cat /dev/nullist nur ein Befehl, der nichts ausgibt. Wenn Sie irgendetwas hineinleiten, passiert daher überhaupt nichts.

Wenn Sie die stdout-Umleitung verwenden, wird die Ausgabe von /dev/zero in die entsprechende Datei geschrieben (/dev/null und daher nirgendwohin).

Antwort3

Was dd if=/dev/zero | cat /dev/nullbedeutet das?

Führen Sie cat /dev/null„stdin“ mit dd„stdout“ aus. Das Problem ist, dass es /dev/nullleer ist. catFühren Sie also das aus, was Sie tun sollen: Öffnen Sie eine leere Datei, schreiben Sie ihren Inhalt in „stdout“ und beenden Sie den Vorgang.

catleitet die Ausgabe von stdin nur weiter, wenn keine Dateien angegeben sind. cat /dev/null -leitet den Inhalt von /dev/null und stdin an stdout weiter.

dd if=/dev/zero | cat /dev/nullAbgesehen von der Verschwendung unterscheidet sich ein Prozess als solches in nichts von cat /dev/null.

Antwort4

Ich habe es unter Cygwin und Ubuntu versucht und unter Ubuntu das richtige Ergebnis erhalten. Wenn ich kein Signal sende, ddfunktioniert es unter Cygwin. Ich würde sagen, das ist ein Fehler.

Als ich versuchte, teedie Ausgabe an eine Datei zu senden, bestand sie nur aus Nullbytes, aber es waren zu viele davon.

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

verwandte Informationen