GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man jedes Programm mit dem Tee-Befehl zum Laufen bringen?

Ich habe ein Programm (in Ruby) geschrieben und es hat gut funktioniert. Es druckt ein paar Textzeilen aus und pausiert dann für eine Minute und wiederholt dann das Obige.

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

ruby myscript.rb | tee record.txt

dann wird die Ausgabe nicht auf dem Bildschirm angezeigt, bis die Ausgabe eine bestimmte Menge erreicht, vielleicht ein paar kb. Dies 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 leeren, aber ich dachte, eine App sollte unabhängig davon sein, was mit der Ausgabe an STDOUT verwendet wird. So kann tee gut funktionieren (vielleicht mit einer Option), oder es könnte ein anderer Befehl verwendet werden, oder vielleicht ist es eine Option von Bash oder der Terminal-App? Gibt es eine Möglichkeit?

Akzeptierte Antwort:

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

Du hast falsch gedacht. Die Laufzeitbibliotheken mehrerer Programmiersprachen, einschließlich der Sprachen C und C++, teilen alle die Semantik, 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 sagt zum Beispiel:

Beim anfänglichen Öffnen ist der Standardfehlerstrom nicht vollständig gepuffert; die Standardeingabe- und Standardausgabestreams werden vollständig gepuffert, wenn und nur wenn bestimmt werden kann, dass der Stream nicht auf ein interaktives Gerät verweist.

Die übliche Wahl, wenn ein Stream nicht an ein Endgerät angeschlossen ist, besteht darin, Einheitspufferung, Zeilenpufferung oder vollständige Pufferung auszuwählen. Einheitspufferung und Zeilenpufferung sind für Standardfehler üblich; Vollständige Pufferung für die Standardausgabe. Dies variiert jedoch je nach Sprache.

Damit die Ausgabe nicht vollständig gepuffert wird, wenn der Ausgabestrom in solchen Sprachen eine Pipe ist, müssen Sie

  • Schreiben Sie Ihr Programm in sich selbst, machen Sie die Standardausgabe zeilengepuffert, intelligent gepuffert oder ungepuffert;
  • Verwenden Sie Dinge, die in die Laufzeitbibliothek Ihrer speziellen Programmiersprache eingebunden sind, wie z. B. stdbuf Befehl if Ihre Programmiersprache ist C oder verwendet (der Teil der I/O-Streams) die C-Laufzeitbibliothek als Basis (was einige Programmiersprachen nicht tun); oder
  • Verwenden Sie Tools wie ptybandage die das Programm denken lassen, dass seine Standardausgabe ein Terminal ist, während diese Ausgabe genommen und an das Schreibende der Pipe gesendet wird.
Verwandte:Wie entscheidet ein Programm, ob es farbige Ausgaben haben soll oder nicht?

Weiterführende Literatur

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Wie lässt sich Iconv dazu bringen, die Eingabedatei durch die konvertierte Ausgabe zu ersetzen?

  2. Wie funktioniert der Tee-Befehl?

  3. Wie funktioniert der Befehl „ls“ unter Linux/Unix?

  4. Wie funktionieren die Optionen „-s“, „-t“ und „-c“ des tr-Befehls in Unix?

  5. Wie funktioniert der ps-Befehl?

So verwenden Sie den Linux-Schlafbefehl mit Beispielen

So verwenden Sie den Linux-te-Befehl

So verwenden Sie den who-Befehl in Linux mit Beispielen

Verwendung des RPM-Befehls (mit Beispielen)

8 Linux-Tee-Befehl mit Beispielen

So finden Sie Dateien mit dem fd-Befehl in Linux