Terminalbefehl stoppen, sobald die Ausgabe eine bestimmte Größe erreicht?

1

Wenn ich rennen will somecommand > somefile aber hör mal auf somefile eine bestimmte Größe erreicht, wie würde ich das tun?

Silas Reel
quelle

Antworten:

3
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.

Kamil Maciorowski
quelle
Du bist diesmal vor mir gekommen!
AFH
Danke für die ausführliche Antwort. Ich gehe davon aus, dass der Teil "bs = 1K count = 2" im Grunde "2 Instanzen von 1 KiB" bedeutet.
Silas Reel
@SilasReel Ja. man dd ist dein Freund. :)
Kamil Maciorowski
Beendet dies den Quellbefehl oder ignoriert es einfach die zusätzliche Ausgabe (AFAIK head tut letzteres)?
xenoid
@ Magnet Es liegt an somecommand wie es auf einen Rohrbruch reagiert. Sieh dir das an: Was bringt einen Unix-Prozess dazu, mit Broken Pipe zu sterben? . In meinem Debian head endet, also bricht es die Pfeife.
Kamil Maciorowski