Befehl zum gleichzeitigen Drucken der Ausgabe auf Konsole und Datei in verschiedenen Threads

2

Ich schreibe ein Bash-Skript und möchte, dass der allerletzte Befehl als separater Prozess gestartet wird. Der letzte Befehl sendet auch alle Ausgaben in eine Datei. Ich möchte jedoch auch, dass die Ausgabe weiterhin auf der Konsole angezeigt wird. Was ich bisher habe, ist

$ command > "file" &

Dadurch wird die Ausgabe an "file" gesendet und der Befehl als eigener Prozess gestartet. Ich möchte jedoch auch gleichzeitig die Ausgabe in der Konsole anzeigen (aber wenn ich Strg + C oder W / E drücke, stoppt der Befehl nicht). Dies ist sehr ähnlich zu dieser Frage , aber mit dem Kaviat, dass es sein eigener Faden sein muss.

Ich habe versucht:

$ command | tee "file" &

Das Problem ist jedoch, dass tee nicht Teil des Prozesses ist und die Ausgabe nicht tatsächlich angezeigt wird.

Um das zu verdeutlichen, möchte ich commandeinen eigenen Prozess haben, der die Ausgabe in eine Datei sendet, aber die Ausgabe immer noch in der Konsole anzeigen (bis ich q drücke, die Eingabetaste drücke, Strg + C oder so). Da es sich um ein Bash-Skript handelt, sind zwei separate Zeilen zulässig.

Humdinger
quelle

Antworten:

2

Es hört sich so an, als ob Sie commanddas Schreiben in die Datei beenden möchten, aber die Anzeige auf der Konsole unterbrechen möchten. Ich würde einen anderen Lösungsansatz wählen. In Ihrem Skript:

> "file"
command > "file" &
tail -n +1 -F "file"

Korrektur:

Die ursprüngliche Antwort verwendet -n 0, die zunächst gibt keine Zeilen "file"gibt aber keine Zeilen hinzugefügt , "file"nachdem tailgestartet. Dies war nicht meine Absicht - es war ein Fehler. Ich beabsichtigte, eine Option zu verwenden, die alle Zeilen auflistet, "file"auch wenn commandeinige zuvor geschrieben tailwurden. Die richtige Option für dieses Verhalten ist -n +1.

Von der tail(1)Manpage:

   -n, --lines = K gibt die letzten K Zeilen anstelle der letzten 10 aus;
                   Oder geben Sie mit -n + K Zeilen aus, die mit Kth beginnen

Die erste Zeile löscht den Inhalt der Datei im Falle einer Racebedingung, bei der taildie Datei zuvor getroffen wurde command.

garyjohn
quelle
Können Sie erklären, was die -n 0Flagge bewirkt?
Humdinger
Ja, das Falsche! Siehe meine Korrektur oben. Ich bin froh, dass du gefragt hast.
Garyjohn
Wenn die Datei nicht bereits vorhanden ist , mögen Sie vielleicht so etwas wie zu tun > file; command > file & tail -n +1 -F fileoder command > file & sleep 1; tail -n +1 -F filegegen die Race - Bedingung zu schützen , in dem der tailProzess beginnt , bevor der fileerstellt wird. In der ersten Option müssen Sie möglicherweise das Schreiben in eine bereits vorhandene Datei verwenden command >> fileoder command >| filezulassen.
Scott
Ich denke, eine bessere Lösung für die Rennbedingung ist es, einfach touch fileeine Zeile vor hinzuzufügen command. In meinem Fall ist die Datei jedoch immer vorhanden.
Humdinger
Scratch das, eine bessere Lösung ist, nichts in die Datei zurückzugeben. Dadurch wird der Inhalt der Datei vor dem tailLesen gelöscht.
Humdinger