Uruchom lub wyślij polecenie do panelu tmux w uruchomionej sesji tmux

60

Chcę napisać skrypt powłoki, który zostanie dołączony do nazwanej sesji tmux, wybierz okno (lub panel) w tej sesji i uruchom polecenie w tym wybranym oknie (lub panelu).

Jak to zrobić ze skryptu bash?

wiem

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

pozwala mi wysyłać polecenia do świeżo utworzonego okna, ale potrzebuję czegoś takiego

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

Myślę, że mógłbym użyć, send-keysale wydaje się, że powinno być coś, co wymaga polecenia lub listy poleceń, które się uruchamiają.

cjroebuck
źródło

Odpowiedzi:

82

Każdy panel tmux jest interfejsem dla pojedynczego pty (pseudo tty). Okna nierozdzielone mają jeden panel; podzielone okna mają wiele okien.

tmux nie zapewnia sposobu dodawania dodatkowych procesów do panelu po uruchomieniu za pomocą początkowej komendy. Proces pierwszego polecenia (zwykle powłoka) należy do sterowania zadaniem 1 dla tego terminala.

Jeśli chcesz zablokować to, co aktualnie jest uruchomione w panelu, możesz użyć respawn-pane -kdo zabicia istniejącego polecenia i zastąpienia go nowym (np respawn-pane -t sessionname:0.4 -k 'some -new command'.).

Ale jeśli chcesz zachować wszystko, co aktualnie działa w okienku, może nie być lepszej opcji niż zwykłe „pisanie na nim” send-keys.

Możesz wykonać skrypt w ten sposób (dołącz ostatni, ponieważ w przeciwnym razie skrypt będzie czekał na odłączenie przed kontynuowaniem):

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"

Zauważ, że w send-keyspoleceniu powinieneś tak naprawdę wpisać litery E n t e r, aby powiedzieć, tmuxaby wysłać klawisz nowej linii do okna. (Oczywiście każde polecenie kończy się na Enterklawiszu.)


1 Kontrola zadań to arbitraż między wieloma grupami procesów w jednej sesji, w której terminal tty jest kontrolerem. Czyli Ctrl+ Zzawiesić klucz, i jobs, fgi bgpowłoki poleceń.

Chris Johnsen
źródło
2
Dzięki za to! I umieścić #{session_name}:#{window_index}.#{pane_index}w moim wierszu stanu, więc można szybko sprawdzić, które szyba do wysyłania poleceń do.
płatny frajer
11

Możesz użyć C-mzamiast Enter. To jest to samo. Ponadto tmuxułatwia wysyłanie do prawego / lewego panelu za pomocą -t rightlub -t left. A jeśli chcesz zaadresować panel w innym oknie, po prostu poprzedz go numerem i kropką okna, na przykład -t 0.right.

Teraz możesz napisać prostą funkcję Bash, aby uzyskać sekwencję kluczy jako argument i łatwo wysłać ją do panelu docelowego.

Aleksey Gureiev
źródło