![Befehl zum gleichzeitigen Drucken der Ausgabe in die Konsole und in eine Datei in verschiedenen Threads](https://rvso.com/image/1400518/Befehl%20zum%20gleichzeitigen%20Drucken%20der%20Ausgabe%20in%20die%20Konsole%20und%20in%20eine%20Datei%20in%20verschiedenen%20Threads.png)
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 command
das 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 tail
dem 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 command
geschrieben 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 tail
die Datei zuvor aufgerufen wurde command
.