下班前几分钟,我彻底玩懂了tmux

news2024/9/24 21:16:38

目录

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux分布式应用 Zabbix监控配置[添加主机 自定义监控内容 邮件报警 自动发现/注册 代理服务器 高可用集群]

-------------------- 添加 zabbix 客户端主机 -------------------- 关闭防火墙 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-agent01 服务端和客户端都配置时间同步 yum install -y ntpdate ntpdate -u ntp.aliyun.com 服务端和客户端都设…

基于simulink跟踪火车站对象检测遗弃物体(附源码)

一、前言 此示例演示如何跟踪火车站的对象并确定哪些对象保持静止。公共场所的遗弃物品会引起当局的关注,因为它们可能会构成安全风险。算法(例如本例中使用的算法)可用于通过将他们的注意力引导到潜在的感兴趣区域来协助监控实时监控视频的…

二十五、传输层协议(上)

文章目录 一、再谈端口号(一)端口号定义(二)端口号范围划分1.一共有 2^16 个端口2.认识知名端口号(Well-Know Port Number)3.端口号和进程就是K-V关系4.netstat(1)示例1: n 拒绝显示别名&#x…

CentOS Linux上安装JDK11、MySQL8.0、Minio等软件(rpm脚本模式)

本地环境:Windows 10家庭版 16G内存 512G硬盘 软件:VMWare WorkStation 16.0 FinalShell 4.0.1 一、下载必要软件包 下载软件均选择x86架构64位!!!(可根据自己的电脑配置选择) CentOS Linu…

基础算法-前缀和

1 算法笔记 2.代码示例 3.代码解析 #include<iostream> using namespace std; const int maxn 1010000; int a[maxn],s[maxn];//a数组是用来存放数组的&#xff0c;s是用来存放前n项数组的和 int m,n;int main(){scanf("%d%d",&n,&m);for(int i1;i&l…

【react】插件react-tsparticles和tsparticles实现粒子特效:

文章目录 一、效果图:二、实现思路:三、实现代码:【1】安装依赖【2】 一、效果图: 二、实现思路: particles&#xff08;npm i react-particles-js&#xff09;目前已被弃用&#xff1b;取代它的是tsparticles&#xff08;npm i react-tsparticles 和npm install tsparticles&a…

docker 安装应用

前文介绍&#xff1a;我们再阿里云领取的ECS服务器&#xff0c;服务器选择应用模板&#xff0c;他会自动帮我们的服务器安装docker的一些相关插件。如果没有&#xff0c;则需要自己安装docker docker 安装Jenkins 1.下载Jenkins镜像 推荐版本 jenkins/jenkins:lts 命令&…

python 实现简易的学员管理系统

文章目录 前言基本思路需求实现1.实现菜单的功能2.提示用户输入需要进行的操作&#xff0c;并执行相关操作3.具体函数功能的实现增加学员信息显示所有学员信息删除学员信息修改学员信息查询学员信息 整体代码展示 前言 前面我们已经学习了 python 的输入输出、条件语句、循环、…

面向对象编程主线三

面向对象编程 三、第三阶段 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b; 低耦合&#xff1a;仅对外暴露少量的方法用于使用。 封装性的设计思想&#xff1a;把该隐藏的隐藏起来&#xff0c;该暴露的暴露出来。 3.1、面向对象的特…

[物理层]传输方式

传输方式 串行传输与并行传输 穿行传输是指数据是一个比特一个比特依次发送的&#xff0c;在发送端与接收端只用一条数据线路 并行传输是指一次发n个比特&#xff0c;在发送端与接收端需要n条数据线路 在网络中计算机通信通常采用串行传输&#xff1b;而在计算机内部&#x…

Minio在Windows的部署并使用Python来操作桶

什么是Minio? MinIO 是一个开源的对象存储服务器&#xff0c;具有高可用性、高性能和可伸缩性。它兼容 Amazon S3 API&#xff0c;因此可以无缝地替代 Amazon S3 作为对象存储的解决方案。 MinIO 可以让你在自己的基础设施中搭建一个对象存储服务&#xff0c;使你能够存储和…

HTML5+CSS3+JS小实例:背景动态变化的登录界面2.0

实例:背景动态变化的登录界面2.0 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" con…

malloc()与calloc()的辨析

malloc()与calloc()的相同点 两者都是常用的内存分配函数&#xff0c;用于动态分配内存 两者返回值类型都为void*&#xff0c;需要强制转换为所需类型 使用完分配的内存后&#xff0c;都需使用free()函数来释放该内存&#xff0c;防止内存泄漏 malloc()与calloc()的不同点 mal…

你可能不知道现在的Java面试有多卷

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;今年面试实在是太卷了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约…

threejs 音频可视化demo

效果&#xff1a; 在线效果预览&#xff1a;Vite App 源码&#xff1a;https://github.com/developer-wgl/ThreeJsDemo 参考&#xff1a;three.js 音乐可视化_threejs音乐可视化_汉武大帝的博客-CSDN博客

谈谈——互联网生活中的隐私保护

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Unity VR:Oculus Integration 中 OVRManager 的 Eye Level,Floor Level,Stage 的区别

Oculus Integration 开发包中有个 OVRManager 脚本被挂载到 OVRCameraRig 物体上。OVR Manager 中有个 Tracking Origin Type 参数&#xff0c;它相当于追踪的参考系&#xff0c;参数分为 Eye Level, Floor Level 和 Stage。 VR 设备会对头显进行追踪&#xff0c;于是现实中头显…

VTK8.2.0的配置过程

VTK8.2.0的配置过程 1、官网下载vtk8.2.0的源码2、下载cmake3、使用cmake对源码进行编译4、报错后对cmake作如下修改配置5、使用vs2017打开生成的项目解决方案6、使用vs2017分别编译形成debug和release版本的可执行代码7、CMAKE_INSTALL_PREFIX/plugins/designer 目录下的 QVTK…

有AI助手帮你,刷任何题都不吃力!

Rider如何配置AI助手&#xff1f; 前言&#xff1a;一、选择AI助手二、如何在Rider中配置CodeWhisperer三、使用方法四、分享你的AI解决方案 明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&…