Empêcher la fermeture du volet / de la fenêtre une fois la commande terminée - tmux


33

Dans mon tmux.conffichier, je l'ai configuré pour ouvrir les fenêtres, les nommer, configurer les volets, etc., etc.

Cependant, j'ai un problème: si l'un des volets lance une commande, disons ls, le volet se ferme une fois la commande terminée (instantanément). Existe-t-il un moyen d'empêcher ce comportement? Ou le faire tomber dans un shell normal une fois la commande terminée?

Je suppose que je dois démarrer un shell -> exécuter la commande lorsque le volet se lance, mais je serai damné si je peux comprendre comment. J'ai googlé un peu pour ce problème, mais j'ai été bref.

Réponses:


22

Vous avez plusieurs options.

  1. Au lieu de s'exécuter lsdans votre fenêtre, exécutez un shell, puis envoyez les touches du shell pour exécuter:

    tmux start-server  
    tmux new-session -d -s session  
    tmux new-window -t session:1  
    tmux send-keys -t session:1 ls C-m
    
  2. Vous pouvez lancer une séquence de commandes de manière à vous laisser avec un shell bash après l'exécution de vos autres commandes:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Voir la réponse de jasonwryan pour plus de détails sur l' remain-on-exitoption permettant de conserver les volets en vie après la fin de leur processus afin que vous puissiez revoir la sortie.

  4. Si la sortie d'une commande valait la peine d'être vue une fois, elle pourrait valoir la peine d'être rafraîchie. Si vous surveillez la sortie de quelque chose, vous pouvez watchobtenir périodiquement de nouvelles sorties. Cela devrait bien fonctionner avec les volets dans tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    

Merci mec! Réponse impressionnante, le numéro 2 et le numéro 4 sont exactement ce pour quoi je travaillais, mais le numéro 1 semble également être une excellente alternative. Merci pour toute l'aide, c'est vraiment apprécié (vous deux).
Ragoût

1
L'avantage de # 1 est que la commande reste dans l'historique du shell et peut être facilement réexécutée. Si la commande était grosse et moche, alors c'est très utile.
goertzenator

1
Il fonctionne pour moi sans la start-servercommande, je pense qu'il démarre automatiquement si nécessaire. Y a-t-il néanmoins un avantage à l'appeler explicitement?
luator

1
@luator Je pense que le démarrage automatique d'un serveur s'il n'en trouve pas aurait pu être ajouté tmuxdepuis que j'ai écrit cette réponse. Je ne connais aucun avantage si votre version engendre un processus serveur si nécessaire.
Caleb

13

Vous pouvez utiliser l' remain-on-exitoption:

rester à la sortie [le | off]
Une fenêtre avec cet indicateur défini n'est pas détruite lorsque le programme en cours d'exécution se ferme. La fenêtre peut être réactivée avec la commande respawn-window.

Pour simplifier le processus de réapparition, vous souhaiterez peut-être le lier à une clé:

bind-key R respawn-window

Cela garantira que vous ne serez pas laissé avec des fenêtres mortes à la fermeture des programmes.


J'y arrivais! J'ai manqué de temps et décidé que je devais modifier ma réponse. Oui, c'est la troisième option, le principal inconvénient est qu'elle laisse une fenêtre en lecture seule que vous ne pouvez pas réutiliser sans recréer.
Caleb

Bon point. J'ai mis à jour avec une (semi) solution de contournement.
jasonwryan

Cela fonctionne-t-il avec des volets?
azmeuk

1
définir cela à partir de la ligne de commande peut être fait avectmux set-option remain-on-exit on
rmanna

1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace

1

Voici un exemple étendu utilisant la send-keysméthode recommandée par @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.