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

cjr*_*uck 72 bash shell tmux

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

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

我知道

tmux new-window -n:mywindow 'exec something'
Run Code Online (Sandbox Code Playgroud)

允许我向新创建的窗口发送命令,但我需要类似的东西

tmux select-window -t:0 'my command'
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*sen 101

每个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"
Run Code Online (Sandbox Code Playgroud)

请注意,在send-keys命令中,您实际上应该键入字母 E n t e r, 来告诉tmux将换行键发送到窗口。(当然,每个命令都以Enter键结尾。)


1作业控制是使用 tty 作为其控制终端的单个会话的多个进程组之间的仲裁。即,Ctrl+Z挂起键,和jobsfgbgshell命令。

  • 谢谢你!我将 `#{session_name}:#{window_index}.#{pane_index}` 放在我的状态行中,这样我就可以快速查看将命令发送到哪个窗格。 (3认同)

Ale*_*iev 16

您可以使用C-m代替Enter. 这是同一件事。此外,tmux使用-t right或可以轻松发送到右/左窗格-t left。如果您想在另一个窗口中寻址窗格,只需在它前面加上窗口编号和句点,例如-t 0.right.

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