在正在运行的tmux会话中运行命令或将命令发送到tmux窗格


59

我想编写一个将附加到命名tmux会话的shell脚本,在该会话中选择一个窗口(或窗格),然后在该选定的窗口(或窗格)中运行命令。

如何从bash脚本执行此操作?

我知道

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

允许我将命令发送到新创建的窗口,但是我需要类似

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

我想我可以使用,send-keys但似乎应该有一些命令或要运行的命令列表。

Answers:


81

每个tmux窗格都是单个pty(伪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挂起键,和jobsfgbgshell命令。


2
谢谢你!我#{session_name}:#{window_index}.#{pane_index}在状态栏中输入了内容,以便快速查看将命令发送到哪个窗格。
付费书呆子

11

您可以使用C-m代替Enter。这是同一件事。另外,tmux通过使用-t right或,可以很容易地将其发送到左右窗格-t left。如果要在另一个窗口中处理窗格,只需在其前面加上窗口号和句点即可,例如-t 0.right

现在,您可以编写一个简单的Bash函数来获取键序列作为参数,并将其轻松发送到目标窗格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.