Weiterführende Literatur

Weiterführende Literatur

Ich habe ein Programm (in Ruby) geschrieben und es hat gut funktioniert. Es druckt ein paar Textzeilen aus, hält dann eine Minute inne und wiederholt dann das oben Gesagte.

Es funktioniert gut (im Terminal von Mac OS X), aber ich habe festgestellt, dass ich, wenn ich die Ausgabe aufzeichnen möchte,

ruby myscript.rb | tee record.txt

dann wird die Ausgabe nicht auf dem Bildschirm angezeigt, bis die Ausgabe eine bestimmte Größe erreicht, vielleicht ein paar KB. Das kann jedoch bedeuten, dass 5 oder 10 Minuten lang nichts auf dem Bildschirm angezeigt wird (und auch nichts in der Datei, wenn ich STRG-C drücke).

Ich könnte das Programm ändern, um die Ausgabe zu löschen, aber ich dachte, eine App sollte nicht wissen, was mit der Ausgabe an STDOUT verwendet wird. Kann man es also so teeeinrichten, dass es gut funktioniert (vielleicht mit einer Option), oder man kann einen beliebigen anderen Befehl verwenden, oder vielleicht ist es eine Option von Bash oder der Terminal-App? Gibt es eine Möglichkeit?

Antwort1

Ich dachte, eine App sollte unabhängig davon sein, was mit der Ausgabe an STDOUT verwendet wird.

Sie haben falsch gedacht. Die Laufzeitbibliotheken mehrerer Programmiersprachen, einschließlich der Sprachen C und C++, haben alle die Semantik gemeinsam, die Pufferung zu ändern, je nachdem, ob sie erkennen, dass der Stream an ein Endgerät angeschlossen ist.

Dies ist in vielen Fällen ein definierter Teil der Sprache. Der C-Sprachstandard besagt beispielsweise:

Beim ersten Öffnen wird der Standardfehlerstrom nicht vollständig gepuffert. Die Standardeingabe- und Standardausgabeströme werden genau dann vollständig gepuffert, wenn festgestellt werden kann, dass sich der Strom nicht auf ein interaktives Gerät bezieht.

Wenn ein Stream nicht an ein Terminalgerät angeschlossen ist, besteht die übliche Auswahl zwischen Unit-Pufferung, Zeilenpufferung oder Vollpufferung. Unit-Pufferung und Zeilenpufferung sind für Standardfehler üblich, Vollpufferung für Standardausgabe. Dies kann jedoch je nach Sprache variieren.

Um also zu erreichen, dass die Ausgabe nicht vollständig gepuffert wird, wenn der Ausgabestrom in solchen Sprachen eine Pipe ist, müssen Sie

  • Schreiben Sie Ihr Programm für sich selbst und stellen Sie die Standardausgabezeile gepuffert, intelligent gepuffert oder ungepuffert ein.
  • Verwenden Sie Dinge, die die Laufzeitbibliothek Ihrer jeweiligen Programmiersprache einbinden, wie zum Beispiel den stdbufBefehlWennIhre Programmiersprache ist C oder verwendet (den Teil der I/O-Streams) die C-Runtime-Bibliothek als Grundlage (was bei manchen Programmiersprachen nicht der Fall ist); oder
  • Verwenden Sie Tools wie ptybandagediese, damit das Programm denkt, seine Standardausgabe sei ein Terminal, während diese Ausgabe an das Schreibende der Pipe gesendet wird.

Weiterführende Literatur

Antwort2

Bitte schauen Sie sich die Antwort anhttps://stackoverflow.com/a/11337109/5656721da es ein häufiges Problem ist. Sie könntenstdbuffoderPufferung aufhebenauch für Ihr Ruby-Programm.

verwandte Informationen