
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/null
ist 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/null
bedeutet das?
Führen Sie cat /dev/null
„stdin“ mit dd
„stdout“ aus. Das Problem ist, dass es /dev/null
leer ist. cat
Fü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.
cat
leitet 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/null
Abgesehen 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, dd
funktioniert es unter Cygwin. Ich würde sagen, das ist ein Fehler.
Als ich versuchte, tee
die 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