目录
- 1. tmux简介
- 2. Session
- 3. Window
- 4. Pane
- 5. 自定义tmux配置
- 6. 在shell脚本中操纵tmux
- References
1. tmux简介
tmux(terminal multiplexer)是一个非常强大的工具,主要有以下几点功能:
- 终端复用: tmux 使你能够在一个单独的窗口或终端会话中运行并管理多个终端。这不仅允许你在不同的任务之间快速地切换,而且还可以在同一屏幕中并排显示多个任务。例如,你可能希望在一个窗口中运行一个文本编辑器,而在另一个窗口中运行一个服务器,或者你可能需要同时监视多个日志文件。tmux 使所有这些都变得可能。
- 会话管理: tmux 允许你创建、访问和控制多个会话。每个会话都是一个完全独立的工作空间,其中可以包含多个窗口和窗格。这就意味着你可以在一个单独的会话中进行一项任务,比如开发一个特定的项目,而在另一个会话中进行另一项任务,比如管理系统。这种方式使得组织工作变得更加容易。
- 持久性: 当你的 SSH 连接断开,或者你的网络连接出现问题时,tmux 仍然会保持运行。所有的会话、窗口和窗格都会被保留,就像你从未离开一样。当你重新连接时,你可以恢复到你离开时的状态,继续你的工作,而不会丢失任何东西。
- 协作: 通过 tmux,多个用户可以在同一会话中工作。这使得团队成员可以共享他们的终端,进行协同编辑,或者进行故障排查。
安装tmux:
# Ubuntu
sudo apt-get install tmux
# MacOS
brew install tmux
我们首先需要了解tmux的三大概念:Session(会话)、Window(窗口) 和Pane(窗格)。
为方便理解,可以简单认为Session是一个浏览器,而Window则是其中的标签页,Pane则是标签页下的工作区(似乎标签页下没有工作区这个概念,但也只能这么强行解释了 )。
命令行中键入 tmux
命令就可以新建一个会话,观察下方的状态栏,它具有以下形式:
可以看到,对于会话而言,它只有名称这一个概念。而对于窗口而言,它同时有编号和名称这两个概念。*
代表当前所在的窗口,-
代表上一个所在的窗口。
在会话中,输入 exit
或按 Ctrl + d
以退出会话(同时会话也会删除)。
2. Session
直接在命令行中执行
tmux
可快速新建一个tmux会话。该会话的名称默认为 已存在的会话数
。例如,若当前已经存在两个会话,那么新的会话名称将是 2
。
下表列出了常用的会话相关的命令:
命令 | 作用 |
---|---|
tmux new -s [会话名称] | 使用自定义名称新建一个会话 |
tmux rename-session -t [旧会话名称] [新会话名称] | 重命名某个已存在的会话 |
tmux detach | 从当前会话中脱离 |
tmux ls | 列出所有会话 |
tmux a -t [会话名称] | 重新接入某个已存在的会话(a是attach的意思) |
tmux kill-session -t [会话名称] | 杀死某个会话 |
tmux kill-session -a | 杀死所有会话 |
tmux switch -t [会话名称] | 切换到某个会话(必须要在会话中执行该命令) |
接下来到了tmux最为关键的部分——快捷键。快捷键由前缀键(prefix key)和命令键组成,且只能在tmux的会话中使用。
tmux的前缀键是 Ctrl + b
,要使用快捷键,应当先按下前缀键,然后再按下命令键,而不是前缀键和命令键一起按。
下表列出了常用的会话相关的快捷键(这里省略了前缀键,下同):
命令键 | 作用 |
---|---|
$ | 重命名当前会话 |
s | 列出所有会话(方向键上下切换会话,左右展开会话中的窗口) |
d | 从当前会话中脱离 |
例如,若要从当前会话中脱离,应当先按下 Ctrl + b
,然后再按 d
,切勿一起按 Ctrl + b + d
。
3. Window
下表列出了常用的窗口相关的快捷键:
命令键 | 作用 |
---|---|
c | 新建一个窗口 |
, | 重命名当前窗口 |
& | 删除当前窗口 |
0-9中的一个数字 | 根据窗口编号跳转到相应的窗口 |
w | 列出所有窗口(假如窗口编号大于9可以通过这种方式进行跳转) |
4. Pane
下表列出了常用的窗格相关的快捷键:
命令键 | 作用 |
---|---|
% | 横向切分出一个窗格 |
" | 纵向切分出一个窗格 |
x | 删除当前窗格 |
0-9中的一个数字 | 根据窗口编号跳转到相应的窗口 |
w | 列出所有窗口(假如窗口编号大于9可以通过这种方式进行跳转) |
方向键 | 在窗格中来回跳转 |
q | 显示所有窗格编号(在编号消失前按下编号可以跳转到相应的窗格) |
z | 最大化当前窗格(最大化后执行相同的操作可以恢复成原样) |
5. 自定义tmux配置
tmux配置文件在 ~/.tmux.conf
,这里贴一份博主自己的配置:
# 启用鼠标模式
# 可使用鼠标点击以在窗格中跳转
# 也可以使用鼠标改变窗格大小
set -g mouse on
# 设置历史命令缓存为 20000
set -g history-limit 20000
# 设置状态栏背景色为品红色
set -g status-bg magenta
# 设置状态栏文字颜色为白色
set -g status-fg white
# 设置状态栏左侧显示会话名称
set -g status-left "[#S] "
# 设置状态栏右侧显示当前日期和时间
set -g status-right "%Y-%m-%d %H:%M"
# 设置当前窗口状态显示格式
set -g window-status-current-format '#[fg=black](#I:#W)'
# 设置非当前窗口状态显示格式
set -g window-status-format '#[default]#I:#W'
# 设置窗口自动重命名
setw -g automatic-rename
# 设置快捷键 Ctrl + h/j/k/l 来切换窗口面板
# -n代表不需要按前缀键
bind -n C-h select-pane -L
bind -n C-j select-pane -D
bind -n C-k select-pane -U
bind -n C-l select-pane -R
# 按下命令键y后,可以在所有窗格同步进行输入
bind y setw synchronize-panes
# 按下命令键r后,重新加载tmux配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"
配置完后,我们需要执行
tmux source-file ~/.tmux.conf
来使配置文件生效。但注意到我们已经配置了快捷键,所以只需要在tmux会话中先按 Ctrl + b
,再按 r
即可加载新的配置。
如果仍未成功加载配置,执行以下命令即可
tmux kill-server
6. 在shell脚本中操纵tmux
在shell脚本中,我们通常会加上 -d
来在后台创建tmux会话(这样可以保证创建会话后不会立即进入会话):
tmux new -ds [会话名称]
创建会话后,使用 send-keys
来向指定的会话发送按键(注意是按键),语法如下:
tmux send-keys -t [会话名称] [按键1] [按键2] ...
例如
tmux new -ds abc
tmux send-keys -t abc pwd
tmux a -t abc
可以看到命令并没有被执行
这是因为 send-keys
的作用只是发送按键,要想让命令被执行,我们还需要在最后发送一个回车键,即修改第二行为
tmux send-keys -t abc pwd Enter
对于包含空格的命令,我们可以使用字符串将它们包裹起来,也可以使用 Space
键。以下两行命令是等价的:
tmux send-keys -t abc "ls -l" Enter
tmux send-keys -t abv ls Space -l Enter
我们还可以发送 Ctrl + c
来中断一个正在执行的命令:
tmux send-keys -t abc C-c
假如会话中有多个窗口,每个窗口有多个窗格,则上述按键会默认发送至该会话的当前活动窗口的当前活动窗格。若要指定窗口窗格进行发送,可以使用如下的语法:
tmux send-keys -t [会话名称]:[窗口编号/窗口名称].[窗格编号] [按键1] [按键2] ...
References
[1] https://github.com/tmux/tmux/wiki/Getting-Started
[2] https://www.cnblogs.com/zuoruining/p/11074367.html