48

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

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

я знаю

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

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

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

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

2 ответа2

69

Каждая панель 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 приостанавливается, и команды shell jobs , fg и bg .

7

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .