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

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

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

$ command > "file" &

Dies sendet die Ausgabe an „Datei“ und startet den Befehl als eigenen Prozess. Ich möchte jedoch gleichzeitig auch die Ausgabe in der Konsole anzeigen (aber wenn ich Strg+C oder w/e drücke, wird der Befehl nicht beendet). Das ist sehr ähnlichdiese Frage, aber mit der Einschränkung, dass es ein eigener Thread sein muss.

Ich habe versucht:

$ command | tee "file" &

aber das Problem besteht darin, dass „tee“ dann Teil des Prozesses ist und die Ausgabe nicht wirklich angezeigt wird.

Nur zur Klarstellung: Ich möchte einen eigenen Prozess haben command, der die Ausgabe an eine Datei sendet, die Ausgabe aber trotzdem in der Konsole angezeigt wird (bis ich q, Enter, Strg+C oder so etwas drücke). Da dies in einem Bash-Skript geschieht, wären zwei separate Zeilen akzeptabel.

Antwort1

Es klingt, 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 verwendete -n 0, das zunächst keine Zeilen von ausgibt, "file"aber alle Zeilen ausgibt, die "file"nach taildem Start hinzugefügt werden. Das war nicht meine Absicht – es war ein Fehler. Ich wollte eine Option verwenden, die alle Zeilen von auflistet, "file"auch wenn einige vor dem Start commandgeschrieben wurden . Die richtige Option für dieses Verhalten ist .tail-n +1

Aus der tail(1)Manpage:

   -n, --lines=K gibt die letzten K Zeilen aus, statt der letzten 10;
                   oder verwenden Sie -n +K, um Zeilen auszugeben, die mit dem K-ten beginnen

Die erste Zeile löscht den Inhalt der Datei im Falle eines Race Condition, bei dem taildie Datei zuvor aufgerufen wurde command.

verwandte Informationen