版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
tmux简介
1、tmux 简介
1.1 安装
- sudo apt-get install tmux
1.2 简介
1.2.1 功能
- tmux(terminal multiplexer)是Linux上的终端复用神器,可从一个屏幕上管理多个终端(准确说是伪终端)。使用该工具,用户可以连接或断开会话,而保持终端在后台运行。类似的工具还有screen,个人对这二者的使用感受是,用过tmux就再也不想用screen了。
- tmux 是一个与 GNU screen 类似的程序,可作为后者的替代品使用。tmux 采用 BSD 许可授权。
- split窗口。可以在一个terminal下打开多个终端,也可以对当前屏幕进行各种split,即可以 同时打开多个显示范围更小的终端。
- 在使用SSH的环境下,避免网络不稳定,导致工作现场的丢失。想象以下场景, 你在执行一条命令的过程中,由于网络不稳定,SSH连接断开了。这个时候,你就不知道之前 的那条命令是否执行成功。如果此时你打开了很多文件,进入了较深层次的目录,由于网络 不稳定,SSH连接断开。重新连接以后,你又不得不重新打开那些文件,进入那个深层次的 目录。如果使用了tmux,重新连接以后,就可以直接回到原来的工作环境,不但提高了工作 效率,还降低了风险,增加了安全性。
1.2.2 会话、窗口、面板
- tmux的结构包括会话(session)、窗口(window)、面板(pane)三部分,会话实质是伪终端的集合,每个面板表示一个伪终端,多个面板展现在一个屏幕上,这一屏幕就叫窗口。基本结构及状态信息如下图所示:
- 基本的操作无非就是对会话、窗口、面板进行管理,包括创建、关闭、重命名、连接、分离、选择等等。
一般使用命令和快捷键进行操作,可在系统shell终端和tmux命令模式(类似vim的命令模式)下使用命令,或者在tmux终端使用快捷键。
server服务器。输入tmux命令时就开启了一个服务器。
session会话。一个服务器可以包含多个会话
window窗口。一个会话可以包含多个窗口。
pane面板。一个窗口可以包含多个面板。
tmux主要包括以下几个模块:
session | 会话:一个服务器可以包含多个会话 |
---|---|
window | 窗口:一个会话可以包含多个窗口 |
pane | 面板:一个窗口可以包含多个面板[强悍的分频] |
注意,将多个命令写在一起作为命令序列时,命令之间要用空格和分号分隔。
2、快捷键 & 速查表
启动新会话:
- tmux [new -s 会话名 -你窗口名]
恢复会话:
- tmux at [-t 会话名]
列出所有会话:
- tmux ls
关闭会话:
- tmux kill-session -t 会话名
关闭所有会话名:
- tmux ls | grep : | cut -d . -f1 | awk ‘{print substr($1, 0, length($1)-1)}’ | xargs kill
2.1 在Tmux中,按下Tmux前缀 ctrl+b,然后:
2.1.1 会话
- :new <回车> 启动新会话
- s 列出所有会话
- ¥ 重命名当前会话
2.1.2 窗口(标签页)
- c 创建新窗口
- w 列出所有窗口
- n 后一个窗口
- p 前一个窗口
- f 查找窗口
- , 重命名当前窗口
- & 关闭当前窗口
2.1.3 调整窗口排序
- swap-window -s 3 -t 1 交换3号和1号窗口
- swap-window -t 1 交换当前和1号窗口
- move-window -t 1 移动当前窗口到1号
2.1.4 窗格(分割窗口)
- % 垂直分割
- " 水平分割
- o 交换窗格
- x 关闭窗格
- 空格 切换布局
- q 显示每个窗格是第几个,当数字出现的时候按数字几就选中第几个窗格
- { 与上个窗格交换位置
- } 与下个窗格交换位置
- z 切换窗格最大化/最小化
2.1.5 同步窗格
这么做可以切换到想要的窗口,输入 Tmux 前缀和一个冒号呼出命令提示行,然后输入:
- :setw synchronize-panes
你可以指定开或关,否则重复执行命令会在两者间切换。 这个选项值针对某个窗口有效,不会影响别的会话和窗口。 完事儿之后再次执行命令来关闭。帮助
2.1.6 调整窗格尺寸
如果你不喜欢默认布局,可以重调窗格的尺寸。虽然这很容易实现,但一般不需要这么干。这几个命令用来调整窗格:
- PREFIX : resize-pane -D 当前窗格向下扩大 1 格
- PREFIX : resize-pane -U 当前窗格向上扩大 1 格
- PREFIX : resize-pane -L 当前窗格向左扩大 1 格
- PREFIX : resize-pane -R 当前窗格向右扩大 1 格
- PREFIX : resize-pane -D 20 当前窗格向下扩大 20 格
- PREFIX : resize-pane -t 2 -L 20 编号为 2 的窗格向左扩大 20 格
2.1.7 杂项:
- d 退出 tmux(tmux 仍在后台运行)
- t 窗口中央显示一个数字时钟
- ? 列出所有快捷键
- : 命令提示符
2.1.8 配置选项:
# 鼠标支持 - 设置为 on 来启用鼠标
* setw -g mode-mouse off
* set -g mouse-select-pane off
* set -g mouse-resize-pane off
* set -g mouse-select-window off
# 设置默认终端模式为 256color
set -g default-terminal "screen-256color"
# 启用活动警告
setw -g monitor-activity on
set -g visual-activity on
# 居中窗口列表
set -g status-justify centre
# 最大化/恢复窗格
unbind Up bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp
unbind Down
bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tm
3.案例
3.0 快捷键
- ctrl+b 0/1/2/3 用来切换窗口
- ctrl+b q 显示窗口号
- ctrl+b 箭头上下左右 切换面板
- ctrl+b z 放大缩小面板
3.1 启动
tmux has-session -t ros 2> /dev/null
if [ $? != 0 ];
then
tmux new-session -n base -s ros -d #create ros session & app windows
tmux new-window -n nav #create app algo windows
tmux new-window -n slam #create app algo windows
tmux new-window -n roscore #create app roscore windows
# roscore 窗口
tmux select-window -t roscore
tmux send-keys "roscore" C-m
sleep 3
# base 窗口 0:机器人底盘 1:激光
tmux select-window -t base
tmux split-window -v -t 0
tmux select-pane -t 0
tmux send-keys "cd ~/robot_driver/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "roslaunch base_driver base_driver.launch" C-m
tmux select-pane -t 1
tmux send-keys "cd ~/robot_driver/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "roslaunch sick_tim sickTim.launch" C-m
# nav 窗口 0:L1 1:commander 2:test.py 3:key
tmux select-window -t nav
tmux split-window -h -t 0 # 竖直分 0 1
tmux split-window -v -t 0 # 0 水平分
tmux split-window -v -t 1 # 1 水平分
tmux select-pane -t 0
tmux send-keys "cd ~/0catkin_ws/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "roslaunch path_fitting L1.launch" C-m
tmux select-pane -t 1
tmux send-keys "cd ~/0catkin_ws/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "roslaunch commander commander.launch"
tmux select-pane -t 2
tmux send-keys "cd ~/0catkin_ws/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "python test.py nav test.json" C-m
tmux select-pane -t 3
tmux send-keys "cd ~/0catkin_ws/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "rosrun teleop_twist_keyboard teleop_twist_keyboard.py"
# slam 窗口 0:启动地图 1:启动定位 2:关闭tmux
tmux select-window -t slam
tmux split-window -v -t 0
tmux split-window -h -t 0 # 0 水平分
tmux select-pane -t 0
tmux send-keys "cd ~/localization_new/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "rosrun map_server map_server map.yaml" C-m
tmux select-pane -t 1
tmux send-keys "cd ~/localization_new/" C-m
tmux send-keys "source devel/setup.bash" C-m
tmux send-keys "roslaunch hybrid_locator_ros test_pf.launch" C-m
tmux select-pane -t 2
tmux send-keys "sh stop.sh"
else
echo "Programme is already running"
fi
tmux attach -t ros
3.2 关闭
#!/bin/bash
killall roscore
tmux kill-session -t ros