J'ai une commande que j'exécute chaque fois qu'un nouveau terminal est ouvert ou qu'une nouvelle connexion est établie.
Ce programme produit une sortie (colorée) qui doit être positionnée avant l'invite de commande. L'exécution peut prendre quelques secondes, ce qui m'empêchera d'utiliser le terminal jusque-là (sauf s'il est exécuté en arrière-plan).
Étant donné que zsh a des moyens avancés de redessiner le terminal sans encombrer le texte existant, je voudrais savoir comment puis-je exécuter cette commande d'une manière que je n'ai pas à attendre qu'elle se termine avant de pouvoir utiliser le terminal, mais que une fois terminé, il imprime la sortie comme si elle n'était pas en arrière-plan en premier lieu.
En pratique, j'aimerais quelque chose qui pourrait faire:
Command output:
... (running on background)
me@computer: somecommand
me@computer: someothercommand
et une fois la commande terminée, j'obtiendrais:
Command output:
* Output foo
* Multiple lines bar
* and some yada
me@computer: somecommand
me@computer: someothercommand
J'ai essayé de mettre le processus en arrière-plan au début, mais il n'affiche pas correctement la sortie. Je reçois quelque chose comme:
Command output:
[2] 32207
me@computer: somecommand
me@computer: someother * Output foo
* Multiple lines bar
* and some yada
[2] + done command
me@computer: someothercommand
Alors, est-ce possible? Si ce n'est pas avec zsh, y a-t-il une solution qui pourrait le faire?
Tous les pointeurs ou informations sont les bienvenus.
zpty
: faire exécuter la commande dans un terminal créé par zsh, avec sa sortie relayée au terminal réel sous le contrôle de zsh.zpty
? Je suis conscient que vous ne pouvez pas avoir deux programmes écrivant sur le même terminal sans une sorte de concurrence sur le curseur. Ma question vient du fait que zsh réécrit déjà l'invite dans certaines configurations. De toute évidence, ce programme devrait écrire dans un tampon temporaire en mémoire qui serait ensuite "imprimé" à l'emplacement spécifique une fois la commande terminée. Tous ces derniers sous le contrôle de zsh.screen
avec un script de démarrage qui divise l'écran et exécute le long runner dans la partie supérieure et la ligne de commande normale dans la partie inférieure.Réponses:
Il s'agit d'une solution simple si vous êtes prêt à accepter une sortie juste au-dessus de la ligne d'invite actuelle.
Lorsque le travail est terminé, l'invite actuelle et le tampon d'entrée seront supprimés et l'intégralité de la commande
stdout
etstderr
seront imprimés.Vous pouvez obtenir beaucoup plus de fantaisie que cela avec le
zsh/curses
module, mais je doute qu'il offrirait un avantage suffisamment important pour mériter l'effort.la source
[1] 27911 27912
sur une seule ligne et comme première ligne sur le Terminal.