Evitar que el panel / ventana se cierre cuando se completa el comando - tmux

33

En mi tmux.confarchivo lo tengo configurado para abrir ventanas, nombrarlas, configurar paneles, etc., etc.

Sin embargo, un problema que tengo es que si uno de los paneles inicia un comando, digamos ls, el panel se cierra una vez que el comando se completa (al instante). ¿Hay alguna forma de prevenir este comportamiento? ¿O tiene que caer a un shell normal después de que se completa un comando?

Supongo que necesito iniciar un shell -> ejecutar el comando cuando se inicia el panel, pero estaré condenado si puedo descubrir cómo. He buscado un poco en Google para este problema, pero me he quedado corto.

Estofado
fuente

Respuestas:

22

Tienes unas cuantas opciones.

  1. En lugar de ejecutar lsen su ventana, ejecute un shell, luego envíe las pulsaciones de teclas del shell para ejecutar:

    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. Puede almorzar una secuencia de comandos de tal manera que se quede con un shell bash después de que se hayan ejecutado sus otros comandos:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Consulte la respuesta de jasonwryan para obtener detalles sobre la remain-on-exitopción de mantener vivos los paneles después de que su proceso haya salido para que pueda revisar la salida.

  4. Si valía la pena ver el resultado de algún comando una vez, podría valer la pena actualizarlo. Si está monitoreando la salida de algo, puede watchobtener periódicamente una nueva salida. Esto debería funcionar bien con paneles en tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    
Caleb
fuente
¡Gracias hombre! Impresionante respuesta, el número 2 y el número 4 son exactamente para lo que estaba trabajando, pero el número 1 también parece una gran alternativa. Gracias por toda la ayuda, es muy apreciada (los dos).
Stew
1
La ventaja del n. ° 1 es que el comando permanece en el historial del shell y se puede volver a ejecutar fácilmente. Si el comando era grande y feo, entonces esto es muy útil.
Goertzenator
1
Me está funcionando sin el start-servercomando, creo que se inicia automáticamente si es necesario. ¿Hay alguna ventaja de llamarlo explícitamente?
luator
1
@luator Creo que el inicio automático de un servidor si no se encuentra ninguno podría haberse agregado tmuxdesde que escribí esta respuesta. No conozco ninguna ventaja si su versión genera un proceso de servidor si es necesario.
Caleb
13

Puedes usar la remain-on-exitopción:

permanecer en la salida [en | off]
Una ventana con este conjunto de banderas no se destruye cuando sale el programa que se ejecuta en él. La ventana puede reactivarse con el comando respawn-window.

Para simplificar el proceso de reaparición, es posible que desee vincularlo a una clave:

bind-key R respawn-window

Esto asegurará que no te quedes con ventanas muertas cuando salgan los programas.

jasonwryan
fuente
¡Estaba llegando allí! Se me acabó el tiempo y decidí que tendría que editar mi respuesta. Sí, esta es la tercera opción, la principal desventaja es que deja una ventana de solo lectura que no puede reutilizar sin volver a crear.
Caleb
Buen punto. He actualizado con una (semi) solución alternativa.
jasonwryan
¿Funciona con paneles?
azmeuk
1
configurar esto desde la línea de comando se puede hacer contmux set-option remain-on-exit on
rmanna
1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace
1

Aquí hay un ejemplo extendido usando el send-keysmétodo recomendado por @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
jtpereyda
fuente