【转】tmux入门指南

按照官方说明,tmux是一个终端复用软件。我接触tmux也就是这几天的事情,但已经发现其强大。作为一个文艺程序员,有必要向大家分享一下,这么好的东东怎敢藏着掖着。

先用起来再说

假设你已经装好tmux,那么在终端中直接输入tmux并回车,就进入了tmux,退出的话大家都懂的,输入exitC-d即可。进入tmux后你在终端中爱干嘛就干嘛,那就有人会问了,在进入tmux之前已经有终端了,那还折腾这个干啥?别急,tmux的作用在于终端复用,也就是说可以把一个终端变成多个终端。在tmux中按C-b c,你就会看到开启了一个新窗口,并在其中打开了一个新的终端。那又有人问了,这有啥用,Linux的终端软件本身就支持打开多个标签页,还折腾这个干啥?额,这个问题问得好,如果你只是在本地开多个终端敲一下ls什么的,貌似确实没什么必要。但想想,你如果要通过SSH登录到远程服务器,有了tmux,你只需要SSH一次就行了,否则,如果你想要在编辑文件的同时到shell中执行某个命令,就得开两个SSH连接,如果你还要同时用数据库,或者要tail某个日志文件的话,那就还得再开几个了,我这前就是这么干的。有了tmux,你只需要一个SSH连接,然后打开tmux,再多敲几次C-b c就好了。对了,你开了几个窗口,怎么在窗口之间切换呢?C-b p是切换到前一个窗口,C-b n是切换到后一个窗口,C-b w是列出所有的窗口随你选,关闭窗口的快捷键是C-b &。你一定发现快捷键中都带C-b,这是tmux的默认快捷键前缀,tmux通过这个前缀才知道你感兴趣的是她而不是别人。好了,你已经可以使用tmux了,总结一下学到的几个快捷键:

C-b c 创建一个新窗口

C-b & 关闭当前窗口

C-b p 切换到上一个窗口

C-b n 切换到下一个窗口

会话,窗口,面板

tmux有三个基本概念:会话,窗口和面板。当你输入tmux后,tmux实际做的事是首先创建一个会话,然后在这个会话中创建一个窗口,这个窗口只包含一个面板,你在其中看到的终端实际上都属于tmux的某个面板。关于窗口的操作在上一节中已经说明,面板又是什么呢?有人说了,你一个窗口就占满一屏,要看另外一个窗口得切换过去,我想要的是同时看到多个窗口的内容,好了,面板就是干这个事儿的。当你在某个窗口中按下C-b %时,你会发现窗口被横向分成两个面板,而如果按下C-b ",窗口则被纵向分成两个面板,按C-b o会跳到下个面板,C-b加方向键则会在自由选择各面板,C-b x会关闭当前面板。

一个会话可以包含多个窗口,我们可以用会话来组织窗口,会话相当于一个工作环境,比如我们可以创建一个work的会话,里面放我们平时开发需要的窗口,tmux默认会创建一个会话,我们也可以通过参数创建指定名称的会话,例如

tmux new-session -s work

在控制台中输入这条命令就可以创建一个名为work的会话并进入它,我们也可以同时指定这个会话中第一个窗口的名字,比如mysql:

tmux new-session -s work -n mysql

关于会话有两个非常重要的操作,即attach和detach,attach就是让某个会话到前台来运行,而detach则是将某个会话放到后台。通常,当我们打开tmux时,tmux在创建一个会话的同时也会attach到这个会话,所以我们会立即看到tmux的窗口。在某个会话中,我们按C-b d会detach这个会话,也就会回到原先的终端控制台,但实际上并没有退出这个会话,比如你可以通过在终端中输入下列命令重新attach到work会话:

tmux attach -t work

一个时刻可能存在多个会话,在tmux外面通过下列命令可以列出当前有哪些会话:

tmux ls

在tmux里面可以按下C-b s来列出会话,然后可以选择一个切换过去。

在我们创建会话的同时也可以加上-d选项以表示不自动attach到这个新会话:

tmux new-session -s work -d

这样的话你会通过tmux ls看到新创建的work会话,并可以通过tmux attach -t workattach到该会话中。

在控制台上可以通过下列命令关闭会话work:

tmux kill-session -t work

上面的一些以tmux打头的命令都是tmux提供的外部接口,是在命令行中供我们直接运行的,事实上,除了对会话的操作之外,在外部也可以直接创建窗口,例如:

tmux new-window -n project -t work

这条命令可以针对work会话创建一个名为project的窗口。

在创建会话和窗口时甚至可以指定要执行的命令:

tmux new-session -s work -n dev -d "ssh [email protected]"

以上命令会在创建work会话后,在其第一个窗口的控制台中执行SSH命令以远程连接到服务器中。

创建窗口时也与此类似,可将命令写在最后。

更为强大的是,tmux可以让你向某个会话[:窗口:面板]发送任意按键:

tmux send-keys -t work:editor ‘emacs‘ C-m

上述命令能够向work会话的editor窗口发送emacs加回车,即在这个窗口中打开emacs编辑器。

有了tmux的各种强大的外部命令,我们就可以自定义脚本,自动化很多事情:

tmux new-session -s work -n mysql -d ‘mysql‘
tmux new-window -n editor -t work
tmux send-keys -t work:editor ‘emacs‘ C-m

将上述命令写在一个shell脚本里,就可以一键完成下述功能:创建一个名为work的会话,第一个窗口命名为mysql,并在其中执行mysql命令进入mysql,第二个窗口名为editor,并在其中打开emacs。

配置文件

除了强大的外部命令之外,tmux也可以通过自己的配置文件来自定义很多东西,在tmux运行时,会读取/etc/tmux.conf中的配置作为系统级别的配置,然后会在当前用户的家目录里面读取.tmux.conf这个配置文件,如果都找不到,就用默认配置。一般情况下,我们只需要在我们家目录里面创建.tmux.conf这个文件来进行自定义配置即可。

在配置文件中,我们可以用到tmux提供的很多命令,可以设置很多变量的值或者给tmux配色等,实际上,很多命令既有外部命令行接口,又可以在配置文件中使用,还可以在tmux内部的命令模式中使用(C-b :命令)。比如上节中用脚本完成的事情同样也可以用配置文件完成,在配置文件中不用加tmux:

new-session -s work -n mysql -d ‘mysql‘
new-window -n editor -t work
send-keys -t work:editor ‘emacs‘ C-m

按键同步发送

我一开始用tmux就是为了向多个终端同步发送一些命令,比如用于多台相同环境的机器上的配置文件同步修改和程序发布。其实这在tmux中只需要一条命令就可搞定,比如有两台机器,首先在一个窗口中开两个面板,分别连到这两台机器,然后按C-b :set synchronize-panes即可开/关面板的同步模式,开启后,在一个面板中输入的按键也会同步发送到另一个面板中,是不是非常容易?

永不断线

tmux实际上是server/client模式,当创建第一个会话时,server就会运行,以后的会话都以attach/detach的方式被server服务,当所有会话都退出时,server才会退出。在我们工作中,经常是SSH连接到服务器上去写代码,但由于网络的不稳定性,会偶尔发生SSH连接中断的情况,这样我们之前的会话就会丢失,如果是一个nohup的后台任务还好,只要我们重新连上去之后,还是可以找到的(但至少需要回到事发现场,比如重新cd到原来的文件夹等),而如果我们正在写代码,还没来得及保存,很可能就杯具了(除非某些编辑器刚好把你最新的代码自动保存过)。tmux不会存在这个问题,不信,你可以在终端中打开tmux,然后关闭这个终端,再打开一个新的终端,输入tmux ls看看,你会发现之前的会话仍然还在,你需要做的只是attach它就行!那么我们平常在SSH连接到服务器上后,再通过tmux去开启我们的工作会话,不管你在里面干什么,都不用担心断线,因为tmux server会帮你保存你的会话,你随时可以attach它,而且你的工作现场一直在那,连目录都不用切换,除非你真的kill掉它。

结对编程

结对编程是不是很酷?事实上我也没试过。很简单,因为它的会话可以被多个client attach,比如A和B两人分别在家通过SSH连接到服务器上,然后都attach到同一个会话中,那么A和B的操作彼此都可以看到,简直碉堡了!

参考资料

  1. 关于tmux的命令快捷键,请在tmux中输入C-b ?
  2. 请在终端中输入man tmux
  3. 《tmux: Productive Mouse-Free Development》

好了,其实我才接触几天,了解得也不是很深,其中的一些理解也可能有误,再加上时间有限,所以错误在所难免,以后可能会根据我的领悟去修改完善这篇入门指南。不过我主要是想抛砖引玉,希望大家都能去用用,去共同发掘这块宝藏。子曾经曰过:神器在手,天下我有!但愿tmux能在你的工作中助你一臂之力。

时间: 2024-10-16 21:50:20

【转】tmux入门指南的相关文章

Quartz.NET简介及入门指南

Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植. 入门指南 本入门指南包括以下内容: 下载 Quartz.NET 安装 Quartz.NET 根据你的特定项目配置 Quartz 启动一个样例程序 下载和安装 你可以下载 zip 文件或使用 Nuget 程序包.Nuget 程序包只包含 Quartz.NET 运

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

【翻译Autofac的帮助文档】1.入门指南

[写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规划你的应用程序 在你的Porject中添加Autofac引用 按照如下步骤设计应用程序的启动环节 创建一个ContainerBuilder 向ContainerBuilder注册组件 通过ContainerBuilder的Build()方法获得Container(后续需用到) 在应用程序运行环节时,

Markdown——入门指南

导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果. Ulysses for Mac 一,认识 Markdown 在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」

Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何可以连接API的语言,包括Java.Assembly和Visual Basic:我不会向你呈现任何跟这些语言相关的代码,这需要你在本教程的指导下自己去完成,有一些人在本API的基础上使用其他语言进行编程取得了相当的成功. 本教程不会教你C语言,也不会告诉你怎样去运行你特定的编译器(Borland C

[转载]TFS入门指南

[原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本月初,我们发布了TFS新基础配置.该配置为建立支持源码管理,工作项和生成(builds)的TFS版本提供了便利. 这是一个好机会将你在VSS(Visual Source Safe)上的资源迁移到TFS,并且还可以选用一些新的特性.现在VS2010 Beta2的正式版已经发布了,下面是该系统的入门指南

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,

物联网操作系统HelloX开发者入门指南

HelloX开发者入门指南 HelloX是聚焦于物联网领域的操作系统开发项目,可以通过百度搜索"HelloX",获取详细信息.当前开发团队正在进一步招募中,欢迎您的了解和加入.如果您希望加入HelloX的开发团队,建议参照下列步骤进行操作: 1.      首先,请亲手熟悉和操作HelloX操作系统,这是我们开发的核心组件之一,所有其它组件(包括后台组件,终端产品等)都围绕HelloX操作系统展开.这一步很容易操作,请从github(github.com/hellox-project/

STM32F10X入门指南---AD转换

首先,点击下面的链接下载我们需要使用的代码.链接 1.添加必要的文件: 之前我们说过,有三个文件是必须添加的,这三个文件分别是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c.其中,前面的xd是根据你的芯片的容量来选择的.这三个文件都可以在千帆提供的代码中找到.文件路径:Core.rar\Core\STM32\Source\Must . 另外,如果想操作IO口,必须添加千帆的一个库文件DeviceBase.cpp.文件路径: