Execute ou envie um comando para um painel tmux em uma sessão tmux em execução

60

Eu quero escrever um script de shell que será anexado a uma sessão tmux nomeada, selecione uma janela (ou painel) nessa sessão e execute um comando nessa janela (ou painel) selecionada.

Como faço isso a partir de um script bash?

eu sei

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

permite enviar comandos para uma janela recém-criada, mas preciso de algo como

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

Suponho que eu poderia usar, send-keysmas parece que deve haver algo que requer um comando ou lista de comandos que são executados.

cjroebuck
fonte

Respostas:

82

Cada painel tmux é uma interface para um único pty (pseudo tty). Janelas não divididas têm um único painel; janelas divididas têm vários painéis.

O tmux não fornece uma maneira de adicionar processos extras a um painel depois que ele é iniciado com seu comando inicial. Cabe ao processo desse comando inicial (geralmente um shell) fornecer o controle de tarefa 1 para esse terminal.

Se você deseja respawn-pane -keliminar o que estiver em execução no painel no momento, pode usar para eliminar o comando existente e substituí-lo por um novo (por exemplo, respawn-pane -t sessionname:0.4 -k 'some -new command').

Mas, se você deseja manter o que está em execução no momento, pode não haver opção melhor do que simplesmente “digitar” com send-keys.

Você pode criar um script como este (anexar por último, porque, caso contrário, o script aguardará a sua desanexação 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"

Observe que, no send-keyscomando, você deve realmente digitar as letras E n t e r, para dizer tmuxpara enviar uma chave de nova linha para a janela. (Naturalmente, todo comando termina com a Enterchave.)


1 Controle de tarefa é a arbitragem entre vários grupos de processos de uma única sessão que usa o tty como seu terminal de controle. Ou seja, o Ctrl+ Zchave de suspensão, e os jobs, fge bgshell de comandos.

Chris Johnsen
fonte
2
Obrigado por isso! Coloquei #{session_name}:#{window_index}.#{pane_index}minha linha de status para ver rapidamente para qual painel enviar comandos.
um nerd pago
11

Você pode usar em C-mvez de Enter. É a mesma coisa. Além disso, tmuxfacilita o envio para o painel direito / esquerdo usando -t rightou -t left. E se você quiser endereçar um painel em outra janela, basta prefixá-lo com o número e o período da janela, como -t 0.right.

Agora você pode escrever uma função Bash simples para obter a sequência de chaves como argumento e enviá-la para o painel de destino facilmente.

Aleksey Gureiev
fonte