Ich habe einen Befehl, den ich jedes Mal ausführe, wenn ein neues Terminal geöffnet oder eine neue Anmeldung vorgenommen wird.
Dieses Programm erzeugt eine Ausgabe (farbig), die vor der Eingabeaufforderung positioniert werden sollte. Die Ausführung kann einige Sekunden dauern, sodass ich das Terminal bis dahin nicht verwenden kann (sofern es nicht im Hintergrund ausgeführt wird).
Angesichts der Tatsache, dass zsh einige erweiterte Möglichkeiten zum Neuzeichnen des Terminals bietet, ohne vorhandenen Text zu überfrachten, möchte ich wissen, wie ich diesen Befehl so ausführen kann, dass ich nicht warten muss, bis er abgeschlossen ist, bevor ich das Terminal verwenden kann Sobald es fertig ist, wird die Ausgabe so gedruckt, als ob sie überhaupt nicht im Hintergrund wäre.
In der Praxis möchte ich etwas, das tun könnte:
Command output:
... (running on background)
me@computer: somecommand
me@computer: someothercommand
und sobald der Befehl beendet ist, würde ich bekommen:
Command output:
* Output foo
* Multiple lines bar
* and some yada
me@computer: somecommand
me@computer: someothercommand
Ich habe versucht, den Prozess beim Start in den Hintergrund zu stellen, aber dann wird die Ausgabe nicht sauber angezeigt. Ich bekomme so etwas wie:
Command output:
[2] 32207
me@computer: somecommand
me@computer: someother * Output foo
* Multiple lines bar
* and some yada
[2] + done command
me@computer: someothercommand
Ist das also möglich? Wenn nicht mit zsh, gibt es da draußen eine Lösung, die das könnte?
Hinweise oder Informationen sind willkommen.
zpty
: Lassen Sie den Befehl in einem von zsh erstellten Terminal ausführen, dessen Ausgabe unter der Kontrolle von zsh an das reale Terminal weitergeleitet wird.zpty
? Mir ist bewusst, dass Sie nicht zwei Programme haben können, die auf dasselbe Terminal schreiben, ohne dass eine Konkurrenz um den Cursor besteht. Meine Frage kommt von der Tatsache, dass zsh die Eingabeaufforderung in einigen Konfigurationen bereits neu schreibt. Offensichtlich müsste dieses Programm in einen temporären In-Memory-Puffer schreiben, der dann nach Beendigung des Befehls an die bestimmte Stelle "gedruckt" wird. Alle letzteren unter der Kontrolle von zsh.screen
einem Startskript zu tun , das den Bildschirm aufteilt und den langen Läufer im oberen Teil und die normale Befehlszeile im unteren Teil ausführt.Antworten:
Dies ist eine einfache Lösung, wenn Sie bereit sind, Ausgaben direkt über der aktuellen Eingabeaufforderungszeile zu akzeptieren.
Wenn die Arbeit erledigt ist, werden die aktuelle Eingabeaufforderung und Eingangspuffer des Befehls der entfernt und das Teilen
stdout
undstderr
gedruckt werden.Sie können mit dem
zsh/curses
Modul viel ausgefallener werden, aber ich bezweifle, dass es einen Vorteil bietet, der bedeutend genug ist, um die Mühe zu verdienen.quelle
[1] 27911 27912
in einer einzelnen Zeile und als erste Zeile in der Terminal.