Oh, aber sponge
ist nicht die einzige Option; Sie müssen nicht erhalten moreutils
, damit dies richtig funktioniert. Jeder Mechanismus funktioniert, solange er die folgenden zwei Anforderungen erfüllt:
- Es akzeptiert den Namen der Ausgabedatei als Parameter.
- Die Ausgabedatei wird erst erstellt, wenn alle Eingaben verarbeitet wurden.
Sie sehen, das bekannte Problem, auf das sich das OP bezieht, ist, dass die Shell alle Dateien erstellt, die für die Arbeit der Pipes erforderlich sind, bevor überhaupt mit der Ausführung der Befehle in der Pipeline begonnen wird. Es ist also die Shell, die tatsächlich abschneidet Die Ausgabedatei (die leider auch die Eingabedatei ist), bevor einer der Befehle überhaupt ausgeführt werden konnte.
Der tee
Befehl funktioniert nicht, obwohl er die erste Anforderung erfüllt, da er die zweite Anforderung nicht erfüllt: Er erstellt die Ausgabedatei immer sofort nach dem Start, sodass er im Wesentlichen so schlecht ist wie das Erstellen einer Pipe direkt in die Ausgabedatei. (Es ist tatsächlich schlimmer, weil seine Verwendung eine nicht deterministische zufällige Verzögerung einführt, bevor die Ausgabedatei abgeschnitten wird. Sie könnten also denken, dass es funktioniert, obwohl dies nicht der Fall ist.)
Alles, was wir brauchen, um dieses Problem zu lösen, ist ein Befehl, der alle Eingaben puffert, bevor eine Ausgabe erzeugt wird, und der den Ausgabedateinamen als Parameter akzeptieren kann, damit wir seine Ausgabe nicht weiterleiten müssen die Ausgabedatei. Ein solcher Befehl ist shuf
. Folgendes wird also dasselbe bewirken sponge
:
shuf --output=file --random-source=/dev/zero
Der --random-source=/dev/zero
Teil shuf
versucht, seine Sache zu erledigen, ohne überhaupt zu mischen, sodass er Ihre Eingabe puffert, ohne sie zu ändern.