Esegui o invia un comando a un riquadro tmux in una sessione tmux in esecuzione


61

Voglio scrivere uno script di shell che si collegherà a una sessione tmux denominata, selezionare una finestra (o riquadro) in quella sessione ed eseguire un comando in quella finestra (o riquadro) selezionata.

Come posso farlo da uno script bash?

lo so

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

mi permette di inviare comandi a una finestra appena creata, ma ho bisogno di qualcosa di simile

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

Suppongo che potrei usare send-keys, ma sembra che non ci dovrebbe essere qualcosa che prende un comando o un elenco di comandi che vengono eseguiti.

Risposte:


83

Ogni riquadro di tmux è un'interfaccia per un singolo pty (pseudo tty). Le finestre non divise hanno un unico riquadro; le finestre divise hanno più riquadri.

tmux non fornisce un modo per aggiungere ulteriori processi a un riquadro una volta che è stato avviato con il suo comando iniziale. Spetta al processo del comando iniziale (di solito una shell) fornire il controllo del lavoro 1 per quel terminale.

Se vuoi bloccare tutto ciò che è attualmente in esecuzione nel riquadro, puoi usare respawn-pane -kper eliminare il comando esistente e sostituirlo con uno nuovo (ad es respawn-pane -t sessionname:0.4 -k 'some -new command'.).

Ma, se si desidera mantenere tutto ciò che è attualmente in esecuzione nel riquadro, potrebbe non esserci un'opzione migliore con cui semplicemente "digitarlo" send-keys.

Potresti copiarlo in questo modo (allegalo per ultimo, perché altrimenti lo script aspetterà solo che ti stacchi prima di continuare):

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"

Si noti che, al send-keyscomando, è necessario digitare effettivamente le lettere E n t e r, per indicare tmuxdi inviare una chiave di nuova riga alla finestra. (Naturalmente, ogni comando termina con il Entertasto.)


1 Il controllo del lavoro è l'arbitrato tra più gruppi di processi di una singola sessione che utilizza tty come terminale di controllo. Vale a dire, il Ctrl+ Zsospendere chiave, e le jobs, fge bgshell comandi.


2
Grazie per questo! Ho inserito la #{session_name}:#{window_index}.#{pane_index}mia riga di stato in modo da poter vedere rapidamente a quale riquadro inviare i comandi.
un secchione pagato

11

Puoi usare C-minvece di Enter. È la stessa cosa. Inoltre, tmuxsemplifica l'invio al riquadro destro / sinistro utilizzando -t righto -t left. E se vuoi indirizzare un riquadro in un'altra finestra, aggiungi semplicemente il prefisso con il numero e il punto della finestra, ad esempio -t 0.right.

Ora puoi scrivere una semplice funzione di Bash per ottenere la sequenza di chiavi come argomento e inviarla facilmente al riquadro di destinazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.