Ejecute o envíe un comando a un panel tmux en una sesión tmux en ejecución

60

Quiero escribir un script de shell que se adjuntará a una sesión tmux con nombre, seleccionar una ventana (o panel) en esa sesión y ejecutar un comando en esa ventana (o panel) seleccionada.

¿Cómo hago esto desde un script bash?

Lo sé

tmux new-window -n:mywindow 'exec something'

me permite enviar comandos a una ventana recién creada, pero necesito algo como

tmux select-window -t:0 'my command'

Supongo que podría usar, send-keyspero parece que debería haber algo que tome un comando o una lista de comandos que se ejecutan.

cjroebuck
fuente

Respuestas:

82

Cada panel tmux es una interfaz para una sola pty (pseudo tty). Las ventanas no divididas tienen un solo panel; Las ventanas divididas tienen múltiples paneles.

tmux no proporciona una forma de agregar procesos adicionales a un panel una vez que se ha iniciado con su comando inicial. Depende del proceso de ese comando inicial (generalmente un shell) suministrar el control de trabajo 1 para ese terminal.

Si desea golpear lo que se está ejecutando actualmente en el panel, puede usarlo respawn-pane -kpara eliminar el comando existente y reemplazarlo por uno nuevo (por ejemplo, respawn-pane -t sessionname:0.4 -k 'some -new command').

Pero, si desea mantener lo que se está ejecutando actualmente en el panel, entonces puede que no haya una mejor opción que simplemente "escribir" send-keys.

Puede escribirlo de la siguiente manera (adjunte el último, porque de lo contrario el script solo esperará a que se separe antes de continuar):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

Tenga en cuenta que, en el send-keyscomando, debe escribir las letras E n t e rpara indicar tmuxque envíe una tecla de nueva línea a la ventana. (Naturalmente, cada comando termina con la Entertecla).


1 El control del trabajo es el arbitraje entre múltiples grupos de procesos de una sola sesión que usa el tty como su terminal de control. Es decir, la Ctrl+ Ztecla para suspender, y los jobs, fgy bgla cáscara comandos.

Chris Johnsen
fuente
2
¡Gracias por esto! Puse #{session_name}:#{window_index}.#{pane_index}mi línea de estado para poder ver rápidamente a qué panel enviar comandos.
un nerd pagado
11

Puedes usar en C-mlugar de Enter. Es lo mismo. Además, tmuxfacilita el envío al panel derecho / izquierdo usando -t righto -t left. Y si desea direccionar un panel en otra ventana, solo prefijelo con el número de ventana y el punto, como -t 0.right.

Ahora puede escribir una función Bash simple para obtener la secuencia de teclas como argumento y enviarla fácilmente al panel de destino.

Aleksey Gureiev
fuente