Wenn ich rennen will somecommand > somefile
aber hör mal auf somefile
eine bestimmte Größe erreicht, wie würde ich das tun?
somecommand | dd bs=1K count=2 iflag=fullblock > somefile
Dadurch werden genau 2 KB in die Datei geschrieben (weniger, wenn somecommand
endet zuerst). iflag=fullblock
wird von POSIX nicht benötigt dd
kann es nicht unterstützen, der Befehl enthält iflag=fullblock
ist nicht tragbar. Vergleichen Sie dieses Szenario um zu sehen, warum es wichtig sein kann.
Nach der Bearbeitung der richtigen Anzahl von Blöcken ( count=2
im obigen Beispiel) dd
beendet, bricht dies die Pipe. Es liegt an somecommand
wie es auf einen Rohrbruch reagiert. Sieh dir das an: Was bringt einen Unix-Prozess dazu, mit einem Rohrbruch zu sterben?
Wenn die Menge der Bytes, die Sie behalten möchten, Sie zwingt, einige unbequeme zu verwenden bs
und / oder count
, bedenken Sie:
somecommand | { dd bs=1M count=1024 iflag=fullblock; dd bs=10 count=1 iflag=fullblock; } > somefile
Der Befehl schreibt 1 GiB (= 1024 MiB) plus 10 Bytes.
Einige Implementierungen von head
erlaube dir zu benutzen -c
Option, um eine beliebige Anzahl von Bytes zu erhalten. Dies ist auch nicht portabel, die Option wird von POSIX nicht benötigt.
Gemäß diese Antwort dd
mit einer Eingangsblockgröße von 1 ( ibs=1
) ist der einzige POSIX-Weg, um eine genaue Anzahl von Bytes zu lesen.
Ob somecommand
generiert eine Textausgabe und Sie möchten die Anzahl der Zeilen in der Datei begrenzen, head
ist jedoch das richtige Werkzeug. Dadurch werden nur die ersten 5 Zeilen gespeichert (wieder weniger, wenn somecommand
endet zuerst):
somecommand | head -n 5 > somefile
Das -n
Option von head
wird von POSIX benötigt.
man dd
ist dein Freund. :)head
tut letzteres)?somecommand
wie es auf einen Rohrbruch reagiert. Sieh dir das an: Was bringt einen Unix-Prozess dazu, mit Broken Pipe zu sterben? . In meinem Debianhead
endet, also bricht es die Pfeife.