跳转至

27 命令行:不只是酷,更重要的是能提高个人效能

你好,我是葛俊。今天,我要与你分享的主题是,命令行下的高效工作技巧。

我先和你讲一个有意思的话题吧。命令行工具常常会给人一种黑客的感觉,好莱坞的电影里面常常出现命令行窗口的使用。不知道你听说过没有,很多好莱坞电影在拍摄时使用的其实是一个叫作nmap的工具。这个工具是做安全扫描的,只不过因为它的显示特别花哨,所以被很多电影采用。在nmap官方网站上,还专门列出来了这些电影的名单。

类似这种可以让自己看起来很忙的工具还有很多,比如Genact。下面是一个使用Genact的录屏,当然这里的命令并没有真正运行。这可能是整个专栏中,唯一一个让你看起来效率很高,实际上却是降低效率的工具,但说不定对你有用,你懂的。

讲完这个娱乐性的话题,我们进入正题吧。

为什么要使用命令行?

GUI图形界面的出现是计算机技术的变革,极大方便了用户。但在这么多年后的今天,命令行工具为什么仍然有如此强大的生命力呢?

在我看来,对软件工程师来说,想要高效开发就必须掌握命令行,主要原因包括:

  • 虽然鼠标的移动和点击比较直观,但要完成重复性的工作,使用键盘会快捷得多。这一点从超市的结算人员就可以看出来,使用键盘系统的收银员总是噼里啪啦地很快就可以完成结算,而使用鼠标点击的话明显慢很多。
  • 作为开发人员,可以比较容易地使用命令行的脚本,对自己的工作进行自动化,以及和其他系统工具联动。但使用GUI的话,就会困难得多。
  • 命令行通常可以暴露更完整的功能,让使用者对整个系统有更透彻的理解。Git就是一个典型的例子,再好的GUI Git系统都只能封装一部分Git命令行功能,要想真正了解Git,我们必须要使用命令行。
  • 有一些情况是必须使用命令行的,比如SSH到远程服务器上工作的时候。

为了演示命令行的强大功能给我们带来的方便,下面是一个在本地查看文件并上传到服务器的流程的录屏。

通过这个案例,你可以看到命令行的以下几个功能:

  • 在提示行会高亮显示时间、机器名、用户名、Git代码仓的分支和状态,以及上一个命令的完成状态。
  • 输入命令的时候,高亮显示错误并自动纠错。
  • 使用交互的形式进行文件夹的跳转,并方便查找文件,还可以直接在命令行里显示图片。
  • 使用交互的工具,把文件上传到远端的服务器,并快速连接到远端查看传输是否成功。

整个流程全部都是在命令行里完成的,速度非常快,用户体验也非常好。正因为如此,我看到的硅谷特别高效的开发人员,绝大多数都大量使用命令行。那,面对成百上千的命令行工具,我们怎样才能高效地学习和使用呢?

我将高效学习使用命令行的过程,归纳为两大步:

  1. 配置好环境;
  2. 针对自己最常使用命令行的场景,有的放矢地选择工具。

今天,我就与你详细讲述环境配置这个话题。而关于选择工具的话题,我会在下一篇文章中与你详细介绍。总结来讲,环境配置主要包括以下四步:

  1. 选择模拟终端;
  2. 选择Shell;
  3. 具体的Shell配置;
  4. 远程SSH的处理。

这里需要注意的是,在命令行方面,macOS和Linux系统比Windows系统要强大许多,所以我主要以macOS和Linux系统来介绍,而关于Windows的环境配置,我只会捎带提一下。不过,macOS和Linux系统中的工具选择和配置思路,你可以借鉴到Windows系统中。

第一步,选择模拟终端

我将一个好的终端应该具有的特征,归纳为4个:

  • 快,稳定;
  • 支持多终端,比如可以方便地水平和纵向分屏,有tab等;
  • 方便配置字体颜色等;
  • 方便管理常用SSH的登录。

macOS系统自带的终端不太好用,常见的替代工具有iTerm2、Terminator、Hyper和Upterm。我平时使用的iTerm2,是一个免费软件,功能强大,具备上面提到的4个特征。下面我就以iTerm2为例展开介绍。其他几个工具上也有类似功能,所以你不必担心。

在多终端的场景方面,iTerm2支持多窗口、多标签页,同一窗口中可以进行多次水平和纵向分屏。这些操作以及窗口的跳转都有快捷键支持,你可以很方便地在网络上搜索到。

在管理常用SSH的登录方面,iTerm2使用Profile(用户画像)来控制。比如,下面是一个连接到远程服务器案例的录屏。

可以看到,在我的工作环境里常会用到4个Profile,其中有两个是连接到远端服务器的,包括Mosh Remote Server 1和SSH Remote Server 2。工作时,我使用Cmd+O,然后选择Server 1这个Profile,就可以打开一个新窗口,连接到这个远程服务器上。

每一个Profile都可以定义自己的字体、颜色、shell命令等。比如,Server 1是类生产服务器,我就把背景设置成了棕红色,提醒自己在这个机器上工作时一定要小心。所以在上面的录屏中你可以看到,连接到远端的SSH标签页,它的背景、标签页都是棕红色。另外,下面是如何对Profile颜色进行设置的截屏。

除了这些基础功能外,iTerm2还有很多贴心的设计。比如:

  • 在屏幕中显示运行历史(Cmd+Opt+B/F)。有些情况下,向上滚动终端并不能看到之前的历史,比如运行VIM或者Tmux的时候。这时,浏览显示历史就特别有用了。
  • 高亮显示当前编辑位置,包括高亮显示当前行(Cmd+Opt+;)高亮显示光标所在位置(Cmd+/)。
  • 与上一次运行命令相关的操作,包括显示上一次运行命令的地方(Cmd+Shift+up),选中上一个命令的输出(Cmd+Shift+A)。

其中第2、3项功能是由一组macOS的集成工具提供的。这个工具集还包括显示图片的命令imgls、imgcat,显示自动补全命令,显示时间、注释,以及在主窗口旁显示额外信息等。这些设计虽然很小,但非常实用。

关于Windows系统,2019年5月微软推出了Windows Terminal,支持多Tab,定制性很强,据说体验很不错。

选择好了终端,环境设置的第二步就是选择Shell。

第二步,选择Shell

在我看来,选择Shell主要有普遍性和易用性这两条原则。

Linux/Unix系统下,Bash最普遍、用户群最广,但是易用性不是很好。常用来替代Bash的工具有ZshFish,它们的易用性都很好。下面是两张图片,用于展示Zsh和Fish在易用性方面的一些功能。

Zsh:

Fish:

我个人觉得Fish比Zsh更方便。事实上,Fish是Friendly Interactive Shell的简称。所以,交互是Fish的强项。可惜的是,Fish不严格遵循POSIX的语法,与Bash的脚本不兼容,而Zsh则兼容,所以我目前主要使用的是Zsh。

选好了模拟终端和Shell之后,便是配置环境的第三步,具体的Shell配置了。

第三步,具体的Shell配置

接下来,我以我自己使用的设置为例,向你介绍Bash、Zsh、Fish的具体配置吧。这里,主要包括命令行提示符的配置和其他配置两个方面。

之所以把命令行提示符单独提出来,是因为它一直展现在界面上,能提供很有用的价值,对命令行高效工作至关重要。下面是一张图片,展示了Bash、Zsh和Fish的命令行提示符。

这个窗口分为三部分,最上面是Bash,中间是Zsh,最下面是Fish,都配置了文件路径、Git信息和时间戳等信息。接下来,我带你一起看看这3个工具应该如何配置吧。

Bash比较麻烦,配置文件包括定义颜色和命令行提示符的两部分:

## 文件 $HOME/.bash/term_colors,定义颜色
# Basic aliases for bash terminal colors
N="\[\033[0m\]"    # unsets color to term's fg color

# regular colors
K="\[\033[0;30m\]"    # black
R="\[\033[0;31m\]"    # red
G="\[\033[0;32m\]"    # green
Y="\[\033[0;33m\]"    # yellow
B="\[\033[0;34m\]"    # blue
M="\[\033[0;35m\]"    # magenta
C="\[\033[0;36m\]"    # cyan
W="\[\033[0;37m\]"    # white

# empahsized (bolded) colors
MK="\[\033[1;30m\]"
MR="\[\033[1;31m\]"
MG="\[\033[1;32m\]"
MY="\[\033[1;33m\]"
MB="\[\033[1;34m\]"
MM="\[\033[1;35m\]"
MC="\[\033[1;36m\]"
MW="\[\033[1;37m\]"

# background colors
BGK="\[\033[40m\]"
BGR="\[\033[41m\]"
BGG="\[\033[42m\]"
BGY="\[\033[43m\]"
BGB="\[\033[44m\]"
BGM="\[\033[45m\]"
BGC="\[\033[46m\]"
BGW="\[\033[47m\]"
## 文件 $HOME/.bashrc,设置提示符及其解释
###### PROMPT ######
# Set up the prompt colors
source $HOME/.bash/term_colors
PROMPT_COLOR=$G
if [ ${UID} -eq 0 ]; then
  PROMPT_COLOR=$R ### root is a red color prompt
fi

#t Some good thing about this prompt:
# (1) The time shows when each command was executed, when I get back to my terminal
# (2) Git information really important for git users
# (3) Prompt color is red if I'm root
# (4) The last part of the prompt can copy/paste directly into an SCP command
# (5) Color highlight out the current directory because it's important
# (6) The export PS1 is simple to understand!
# (7) If the prev command error codes, the prompt '>' turns red
export PS1="\e[42m\t\e[m$N $W"'$(__git_ps1 "(%s) ")'"$N$PROMPT_COLOR\u@\H$N:$C\w$N\n\["'$CURSOR_COLOR'"\]>$W "
export PROMPT_COMMAND='if [ $? -ne 0 ]; then CURSOR_COLOR=`echo -e "\033[0;31m"`; else CURSOR_COLOR=""; fi;'

命令行提示符之外的其他方面的配置,在Bash方面,我主要设置了一些命令行补全(completion)和别名设置(alias):

## git alias
alias g=git
alias gro='git r origin/master'
alias grio='git r -i origin/master'
alias gric='git r --continue'
alias gria='git r --abort'


## ls aliases
alias ls='ls -G'
alias la='ls -la'
alias ll='ls -l'


## git completion,请参考https://github.com/git/git/blob/master/contrib/completion/git-completion.bash
source ~/.git-completion.bash

Zsh的配置就容易得多了,而且是模块化的。基本上就是安装一个配置的框架,然后选择插件和主题即可。具体来说,我的Zsh命令行提示符配置步骤包括以下三步。

第一,安装oh-my-zsh。这是一个对Zsh进行配置的常用开源框架。

brew install zsh

第二,安装powerline字体,供下一步使用。

brew install powerlevel9k

第三,在~/.zshrc中配置ZSH_THEME,指定使用powerlevel9k这个主题。

ZSH_THEME="powerlevel9k/powerlevel9k"

命令行提示符以外的其他配置,主要是通过安装和使用oh-my-zsh插件的方式来完成。下面是我使用的各种插件,供你参考。

## 文件~/.zshrc.sh 中关oh-my-zsh的插件列表,具体插件细节请参考https://github.com/robbyrussell/oh-my-zsh,以及使用Web搜索查询
plugins=(
  git
  z
  vi-mode
  zsh-syntax-highlighting
  zsh-autosuggestions
  osx
  colored-man-pages
  catimg
  web-search
  vscode
  docker
  docker-compose
  copydir
  copyfile
  npm
  yarn
  extract
  fzf-z
)

source $ZSH/oh-my-zsh.sh

至于Fish的配置,和Zsh差不多,也是安装一个配置的框架,然后选择插件和主题即可。在配置命令行提示符时,主要步骤包括以下两步。

第一,安装配置管理框架oh-my-fish:

curl -L https://get.oh-my.fish | fish

第二,查看、安装、使用oh-my-fish的某个主题,主题会自动配置好命令行提示符:

omf theme
omf install <theme>
omf theme <theme>

## 我使用的是bobthefish主题
omf theme bobthefish

这里有一篇不错的关于使用oh-my-fish配置的文章,供你参考。

Fish的其他方面的配置,也是使用oh-my-fish配置会比较方便。关于具体的配置方法,建议你参照官方文档

关于环境的最后一个配置,是远程SSH的处理。

第四步,远程SSH的处理

SSH到其他机器,是开发人员的常见操作,最大的痛点是,怎样保持多次连接的持久性。也就是说,连接断开以后,远端的SSH进程被杀死,之前的工作记录、状态丢失,导致下一次连接进去需要重新设置,交易花销太大。有两类工具可以很好地解决这个问题。

第一类工具是Tmux或者Screen,这两个工具比较常见,用来管理一组窗口。

接下来,我以Tmux为例,与你描述其工作流程:首先SSH到远程服务器,然后用远程机器上的Tmux Client连接到已经运行的Tmux Session上。SSH断开之后,Tmux Client被杀死,但Tmux Session仍然保持运行,意味着命令的运行状态继续存在,下次SSH过去再使用Tmux Client连接即可。

如果你想深入了解Tmux的概念和搭建过程,可以参考这篇文章

第二类是一个保持连接不中断的工具,移动Shell(Mobile Shell)。这也是我目前唯一见到的一个。这个工具是MIT做出来的,知道的人不多,是针对移动设备的网络经常断开设计的。

它的具体原理是,每次初始登录使用SSH,之后就不再使用SSH了,而是使用一个基于UDP的SSP协议,能够在网络断开重连的时候自动重新连接,所以从使用者的角度来看就像从来没有断开过一样。

接下来,我以阿里云ECS主机、运行Ubuntu18.04为例,与你分享Mosh+Tumx的具体安装和设置方法。

第一,服务器端安装并运行Mosh Server。

junge@iZ4i3zrhuhpdbhZ:~$ sudo apt-get install mosh

第二,打开服务器上的UDP端口60000~61000。

junge@iZ4i3zrhuhpdbhZ:~$ sudo ufw allow 60000:61000/udp

第三,在阿里云的Web界面上修改主机的安全组设置,允许UDP端口60000~61000。

第四,在客户端(比如Mac上),安装Mosh Client。

jasonge@Juns-MacBook-Pro-2@l$ brew install mosh

第五,客户端使用Mosh,用与SSH一样的命令行连接到服务器。

jasonge@Juns-MacBook-Pro-2@l$ mosh junge@<server-ip-or-name>

下面这个录屏演示的是,我日常工作中使用Mosh + Tmux的流程。期间我会断开无线网,你可以看到Mosh自动连接上了,就好像来没有断过一样。

小结

今天,我与你分享的是使用命令行工具工作时,涉及的环境配置问题。

首先,我与你介绍了选择模拟终端、选择和配置Shell的重要准则,并结合案例给出了具体的工具和配置方法,其中涉及的工具包括iTerm2、Bash、Zsh、Fish等。然后,我结合远程SSH这一常见工作场景,给出了使用Tmux和Mosh的优化建议。

掌握了关于环境配置的这些内容以后,在下一篇文章中,我将与你介绍具体命令行工具的选择和使用。

其实,我推荐开发者多使用命令行工具,并不是因为它们看起来炫酷,而是它们确实可以帮助我们节省时间、提高个人的研发效能。而高效使用命令行工具的前提,是配置好环境。

以Mosh为例,我最近经常会使用iPad SSH到远端服务器做一些开发工作。在这种移动开发的场景下,iPad的网络经常断开,每次重新连接开销太大,基本上没办法工作。于是,我最终发现了Mosh,并针对开发场景进行了设置。现在,每次我重新打开iPad的终端时,远程连接自动恢复,好像网络从没有断开过一样。这样一来,我就可以在移动端高效地开发了。

而对研发团队来说,如果能够对命令行工作环境进行优化和统一,毫无疑问会节省个人选择和配置工具的时间,进而提升团队的研发效能。

思考题

你觉得Tmux和Screen的最大区别是什么?是否有什么场景,我们必须使用其中的一个吗?

感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!

精选留言(8)
  • 我来也 👍(13) 💬(2)

    这篇文章我也有些想说的. ----- 我用这些工具可以做到的事情有: 1.每次即使是重启了系统(虽然mac不长重启),也能在有限的4步后恢复到工作状态. 之前的各种连接,打开的文件,执行的程序都还在,路径都不用切换,相对位置都一样. 2.由于使用了mosh,即使是电脑断网了,休眠了,只要网络恢复了,连接依旧还在那里. 3.每次vi的窗口太多了,只需要退出后重新执行 `vi -S .workspace` 就可以恢复到最初的状态. 4.即使电脑忘记了携带,换了另外一台电脑,只要能ssh/mosh到服务器上, 执行mux命令就可以进入到之前服务器上的工作状态.比较方便快速处理线上问题. ----- 我的开发工具,老师的文章几乎都覆盖了,写的也很详细了.我就不重复了. 但是有一个工具tmuxinator,我想要着重推荐下. 这个可以使用yaml文件自定义执行的操作命令. 编辑好配置文件后,可以一条命令,同时开启很多tmux窗口,并布局好,执行好一系列的命令. 有了tmuxinator,即使是重启了电脑,也不怕终端丢失,有限的几步就可以恢复现场了. ----- 我工作中的使用场景是这样的: 1.开启iTerm2 2.本地执行mux(tmuxinator的别名),开启多个标签,分别执行预定义的命令.[重点] 3.在mux打开的窗口中执行Ctrl+d.(临时端口该会话 为一下步做准备) 4.使用`tmux ls && read session && tmux -CC attach -t ${session:-default} || tmux -CC new -s ${session:-default}` (这个命令可放在iTerm2的Profile-Command中 不用记) 执行后,选中tmux的会话名,会在新的iTerm2窗口中打开该tmux的各标签. 几乎不用记tmux的各种命令,像原生使用iTerm一样切换各标签. 关于第2步,我想着重说一下. 我一般是开启9个窗口. 前几个标签使用mosh登录到服务器上(测试&预生产&线上环境), 再在服务器上使用mux开启多个标签页.不同的标签页可能切换到不同的路径,执行不同的命令. 再用一个标签在本地执行mux.把会用到,但不那么频繁命令集成进去.(比如本地测试时的几个目录,避免频繁的切换路径.) 后面的几个标签就会打开最常使用的路径.比如项目目录. 另外我用VIM开发项目,我一般都会为项目配置一个文件(比如叫.workspace). 使用`vi -S .workspace`就可以直接进入到工作状态.比如打开常用文件,执行常用命令. 这个文件实际上就是vi中的命令,避免每次重新输入.我的文件内容大致如下

    &quot; 加载文件
    badd app&#47;init.go
    badd main.go
    
    &quot; 切换buffer 打开侧边栏
    buffer 2
    bdelete 1
    call tagbar#OpenWindow()
    
    ----- 推荐阅读的博文(也是我在网上找的,写的非常详细) Alfred 强烈推荐阅读:http://louiszhai.github.io/2018/05/31/alfred/ Tmux 强烈推荐阅读:http://louiszhai.github.io/2017/09/30/tmux/ tmuxinator 初步了解下:https://www.jianshu.com/p/49b70f705acf Swish 初步了解下:https://sspai.com/post/55285 ----- 我的工作环境 我的装备是:Macbook Pro 13' + 4K显示器 + HHKB蓝牙键盘 我的开发工具是:iTerm2 + oh-my-zsh(比老师多一个autojump插件) + mosh + tmux + tmuxinator(配合tmux使用.使用yml配置文件) + vim 另外的系统工具是:Alfred + SizeUp + Swish(这个是用鼠标的 但也强烈推荐). 为了使用mosh,我才换的苹果电脑.现在也才使用了一年时间. ----- 题外话 我是十一期间在池老师的twitter上看到的<特别放送 | 每个开发人员都应该学一些VIM>推荐,然后连着看了四篇. 觉得比较适合我吧.虽然老师讲的东西我大多都懂,但是系统的跟着老师来一遍,也觉得蛮过瘾的. 我工作了十年,但周边可交流的人并不多.他们大都是用的IDE. 就我比较独特,用的VIM,对命令行和一些工具也比较感兴趣.较少用鼠标. 今天早上等优惠劵到账后就来买了专栏,接着看.(都忘记使用返现链接了😁)

    2019-10-26

  • Johnson 👍(7) 💬(4)

    tmux和screen之间的区别还真没怎么注意过,不过从开始用的时候感觉screen就比较老了,tmux更新好像更积极一些,可能区别在于tmux更强调强大的交互?session,window,pane 反正tmux给我的感觉就是分屏好用强大。 Terminal 在MacOS上大多数人都会选择iTerm2,我以前也是,不过现在我发现它大部分的功能我都用不到,而且它对xterm支持的并不是很全,我想让spacemacs在terminal中的光标的形状和颜色跟着模式变,这样非常棒,如果是iTerm2的话我就没法用xterm的控制字符序列来改变光标的形状和颜色,得用它自己的控制序列。所以我现在就直接用MacOS自带的terminal+MacForge(扩展管理)+MouseTerm plus(实现了xterm的OSC 12/112),仅供大家参考。 Windows上的terminal很多,爱用什么的都有,但我感觉在Windows上没有类linux系统的搭配光有terminal是不够的。我是用Msys2,它自带的mintty就我的尝试来说,是唯一能满足我所有需求的terminal,作者维护开发也很积极,能让spacemacs完美的工作。Msys2可以让我们使用ssh sshserver,mosh,tmux以及常用的linux命令,体验很好,虽然比起WSL稍微慢点儿,但这个方案可以让你在windows很多版本上都能有同样的体验,不像WSL你必须得起码是win10。 Linux上的terminal更多了,感觉所有的服务器都有xterm,但是它确实太老了,gnome-terminal算是不错的选择吧,之前比较喜欢用xbuntu,所以觉得xfce-terminal好,gnome-terminal和mac上的terminal的配置不支持配置文件的方式真是蛋疼,没法把配置放到dotfiles的git仓库里面,xfce-terminal就可以,但后来发现xfce-terminal对xterm控制序列支持的更差。不过现在看来我都是在windows或mac登到linux上,所以对linux上的terminal需求不是很大,感觉还好。 Shell 自己开发机还是zsh最合适,尤其是oh-my-zsh的git, zsh-syntax-highlighting, zsh-autosuggestions这三个插件,绝对对得起这篇的题目。这里提醒大家git插件使用的时候,如果进入一个code量特别大的repo比如LLVM这种,你会发现git插件把shell拖得特别卡,解决方法在https://blog.csdn.net/a_ran/article/details/72847022。 Bash在服务器上最常见了,大家支持的比较多,好多公司发布一些软件产品中的脚步也是用bash执行,有时候工作需要编个小脚步也是不错的。 Csh或者叫tcsh在一些EDA工具或者硬件芯片开发的服务器上基本都是默认,我勒个天,在bash或zshrc里面一句话的功能,在csh里面能把你搞死,就编脚本而言,我们还是远离它吧,哈哈哈。 SSH/Mosh+Tmux Mosh + tmux 绝对是绝配,只可惜好多公司内部安全部门不给开放端口没法用,这里有个有趣的小问题,既然Mosh肯定能连回到server,那按理上为什么我们还需要tmux呢?大家可以想一下,答案见keithw在https://github.com/mobile-shell/mosh/issues/394的回答。 如果没有mosh,可以用autossh来自动重新发起ssh连接并且自动attach到当时断掉的那个tmux session,具体方法请看我的github仓库https://github.com/Johnson9009/dotfiles/blob/master/shell/zsh/local.alias.zsh.template#L36。不过即使这样也没法跟mosh比。 最后说我认为最重要的 dotfiles,也就是用github仓库管理这堂课讲的所有工具的配置,它是一种可以把linux系统的home目录用git仓库管理的思路。如果这些工具的配置文件不用git仓库管理起来的话,个人效能还是不够高,管理好的话,到了一个新公司,也许只需要一两个小时你就可以将你高效的环境建立起来。更关键的是,这种用github管理起来的方式,可以让你不断的优化你的这套个人高效能环境。我现在就切身体会到了它的好处,只不过我太懒,没有什么文档说明我的dotfiles仓库,如果大家有兴趣借鉴可以去看commit message和注释,这两个写的还是蛮认真的。 说了这么多,欢迎大家一起分享,以及拍砖,哈哈哈。

    2019-10-26

  • hexinzhe 👍(3) 💬(1)

    请葛大展开讲讲ipad ssh 工作流

    2019-10-25

  • Hills录 👍(2) 💬(1)

    coder (vs code 的web 版本)+ tmux,用了很久了,随时随地任何设备恢复开发环境。

    2019-11-25

  • 技术修行者 👍(1) 💬(1)

    这篇很实用!赶紧把自己的工作台配置优化一下!

    2020-02-26

  • 一品凡心 👍(0) 💬(1)

    对于一些内部工具,我有时候拿screen管理轮询进程,随时可以穿梭进去,看现场log,也不用tail,有问题,直接杀掉,处理,再启动运行,退出screen

    2020-05-27

  • Jxin 👍(0) 💬(1)

    🤣手贱买的surface。压着重装黑苹果的想法,周末去研究下win的窗口先。

    2019-10-25

  • Alan He 👍(0) 💬(0)

    iTerm2+Tmux的使用分享可以讲下就更香了,iTerm2现在集成了Tmux

    2022-05-01