Запустите или отправьте команду на панель tmux в запущенном сеансе tmux

61

Я хочу написать скрипт оболочки, который будет прикрепляться к именованному сеансу tmux, выбрать окно (или панель) в этом сеансе и запустить команду в этом выбранном окне (или панели).

Как мне сделать это из сценария Bash?

я знаю

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

позволяет мне отправлять команды в только что созданное окно, но мне нужно что-то вроде

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

Я полагаю, я мог бы использовать, send-keysно кажется, что должно быть что-то, что принимает команду или список команд, которые запускаются.

cjroebuck
источник

Ответы:

83

Каждая панель tmux является интерфейсом для одного pty (pseudo tty). Не разделенные окна имеют одну панель; разделенные окна имеют несколько панелей.

tmux не предоставляет способ добавления дополнительных процессов в панель после запуска ее начальной командой. Это зависит от процесса этой начальной команды (обычно от оболочки), чтобы обеспечить управление заданием 1 для этого терминала.

Если вы хотите перекрыть все, что в данный момент выполняется на панели, вы можете использовать, respawn-pane -kчтобы убить существующую команду и заменить ее новой (например, respawn-pane -t sessionname:0.4 -k 'some -new command').

Но, если вы хотите сохранить то, что в данный момент выполняется на панели, то, возможно, не найдется лучшего варианта, чем просто «набрать текст» с помощью send-keys.

Вы можете написать его так (присоедините последний, потому что в противном случае скрипт просто подождет, пока вы отсоединитесь, прежде чем продолжить):

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"

Обратите внимание, что в send-keysкоманде вы должны ввести буквы E n t e r, tmuxчтобы отправить ключ новой строки в окно. (Естественно, каждая команда заканчивается Enterключом.)


1 Управление заданиями - это арбитраж между несколькими группами процессов одного сеанса, который использует tty в качестве управляющего терминала. Т.е., Ctrl+ Zприостановить ключ, и jobs, fgи bgкоманды оболочки.

Крис Джонсен
источник
2
Спасибо за это! Я вставил #{session_name}:#{window_index}.#{pane_index}в свою строку состояния, чтобы я мог быстро увидеть, на какую панель отправлять команды.
платный ботаник
11

Вы можете использовать C-mвместо Enter. Это то же самое. Кроме того, tmuxпозволяет легко отправлять на правую / левую панель с помощью -t rightили -t left. И если вы хотите обратиться к панели в другом окне, просто добавьте к ней номер окна и период, например -t 0.right.

Теперь вы можете написать простую функцию Bash, чтобы получить последовательность ключей в качестве аргумента и легко отправить ее на целевую панель.

Алексей Гуреев
источник