我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有说明
这是今天的 Release https://github.com/simba-fs/2021-ironman-example/releases/tag/day07
昨天的结尾提到要整合 tmux 和 zsh 不是在 ~/.zshrc
结尾执行 tmux
这麽简单,今天就让我们看看会遇到什麽问题吧!
在正式开始前,先让我们看看直接在 ~/.zshrc
後面执行 tmux
会发生什麽错误
直接执行 tmux |
嗯,错误讯息说要 unset $TMUX 那我们就照作吧!
加上 unset TMUX,嗯,爆炸了! |
可以看到,如果直接执行 tmux
的话总是会跳出一个错误 sessions should be nested with care, unset $TMUX to force
,这段讯息告诉我们,不能建立巢状 tmux,除非将 $TMUX 环境变数移除。欸?我们不是只执行一次 tmux 吗?为什麽会他说我们建立巢状 tmux?我们来看看登入之後发生了什麽事:
~/.zshrc
,初始化终端机後执行 tmux
~/.zshrc
又被执行一次,tmux
被执行第二次
看来问题在於 tmux 和 zsh 执行的回圈停不下来,那我们就在执行 tmux 之前作个条件判断,$TMUX 为空再执行 tmux
好了
❓ > $TMUX 是什麽 |
---|
$TMUX 是一个环境变数,是一个由三个部份串起来、以逗号分开的字串,第一部份是 tmux 的 unix socket 路径,第二部份是 tmux 的 pid,最後是目前 tmux window 的编号(左下角那个数字)。这个环境变数只有在 tmux 里面的 session 会设定,所以可以当作 tmux 是否启动的检查 |
我们在 ~/.zshrc
中执行 tmux
的那行做一些修改
+ if [[ -z $TMUX ]];then
tmux
+ fi
提示:
-z $TMUX
和$TMUX == ""
效果是一样的
接下来我们看看这样修改效果如何
先检查 $TMUX 再执行 tmux |
可以看到,巢状 tmux 的算是问题解决了,但是你会发现离开 tmux 之後还是一个完整的 zsh,但是这时候你已经结束工作了,不需要再一个 shell,你希望关掉 tmux 之後应改关掉终端机视窗的,这又要怎麽办呢?
题外话,从这里开始就是个人龟毛,想要把使用体验调整到最好
这里介绍一个内建指令 exec
,这个指令会把当作的 shell 用後面的执行档替换掉。例如我们现在的 shell 是 zsh,执行 exec ssh [email protected]
之後,我们的 shell 就会换成 ssh 了。这有什麽好处?简单来说就是离开这个指令後就会离开终端机,不会再回到原本的 shell。这个效果刚好和我们的需求是一样的,所以要解决多余的 zsh,就只需要在 tmux
前面加上 exec
if [[ -z $TMUX ]];then
- tmux
+ exec tmux
fi
❓ > exec cmd 和 cmd; exit 有什麽不一样 |
---|
这两个写法都会有一样的效果 —— 结束 cmd 後离开,但是他们达成的原因不同,详细叙述在 stackover flow 有相关讨论,有兴趣可以看看 |
你有可以用 htop 之类的工具看看 process 的结构,你就会知道 exec 和 exit 差别在哪了 |
~/.zshrc
我们回头看看目前的 shell 启动流程,你会发现虽然我们不会回到最初的 zsh,但是他却做了一堆无意义的初始化、外挂载入,我们可以将这段设定纳入 if 里面,需要时才执行,如果只是要启动 tmux 就不必走一遍设定 plugin 之类的流程,改进後的 ~/.zshrc
大概长这样
if [[ -z $$TMUX ]]; then
exec tmux
else
# init zsh ......
fi
如此一来载入速度和记忆体用量都会有一咪咪的减少
有时候你可能会不想启动 tmux,例如 ssh 到远端主机,在远端主机上启动 tmux 而不是在本机上启动(在本机上启动的话要开很多 ssh 连线,在远端启动只要连线一次),这时候就要有一个机制可以把主机上的 tmux 关掉,回到原本的 shell,达成方法有很多,这里我介绍一个我觉得最优雅的方法,在 ~/.zshrc
中 tmux 启动判断上加上以下条件
- if [[ -z $TMUX ]]; then
+ if [[ -z $TMUX ]] && [[ ! -f $HOME/.notmux ]]; then
这时候 tmux 启动条件就变成「tmux 还没启动」且「~/.notmux
不存在」,在这里我们把 ~/.notmux
这个档案当作一个开关,如果这个档案存在 tmux 就不会启动。
如果你想启动一个没有 tmux 的终端机,先建立 ~/.notmux
档案 touch ~/.notmux
,然後开启新的终端机
今天的内容比较杂,修改的部份也比较零散,下面是目前 ~/.zshrc
的内容
if [[ -z $TMUX ]] && [[ ! -f $HOME/.notmux ]]; then
exec tmux
else
source ~/.zplug/init.zsh
# plugins
zplug 'romkatv/powerlevel10k', as:theme, depth:1
zplug 'zsh-users/zsh-autosuggestions'
zplug 'marlonrichert/zsh-autocomplete'
zplug 'hlissner/zsh-autopair'
if ! zplug check --verbose; then
printf "Install? [y/N]: "
if read -q; then
echo; zplug install
fi
fi
zplug load
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
if [[ -z $TMUX ]]; then
tmux
exit
fi
fi
<<: Day 0x13 UVa299 Train Swapping
>>: Spring Framework X Kotlin Day 15 AOP
DAY10 用 Automated ML 快速开发 今天我们来体验一下 AML 的 Automate...
此篇会介绍 Bootstrap 客制化 sass 原始码架构,着重在如何使用原始码来客制化自己的 ...
Reasons for a slow Computer System**** Too many st...
引言 昨天介绍了套件管理软件以及图形化使用者界面的安装,也是指令介绍的最後一篇文章。学习了这麽多指令...
在前面的文章中,我们有浅谈到Javascript在网页中所扮演的角色,而Javascript到底是甚...