用zsh增强shell
安装
ubuntu 安装 zsh
sudo apt install zsh
如果没有切换zsh, 请用以下命令切换shell
chsh -s $(which zsh)
增强的功能
-
补全
zsh 的命令补全功能非常强大,可以补齐路径,补齐命令,补齐参数等。(请问你记住 tar 的所有参数了吗😃,只要 tar -加 tab 键,再也不用 rtfm 了😂)
以前杀进程是
ps aux | grep xxx
查进程的 PID,然后kill PID。有了 zsh,直接kill xxx然后按下 tab 键即可 -
别名
zsh 不仅支持普通 alias,还支持针对文件类型的 alias。
-
跳转
zsh 的目录跳转更为智能,你无需输入cd,直接输入路径即可。..表示后退一级目录,../../表示后退两级,依次类推。(…的作用和../../相同)
输入d,将列出当前 session 访问过的所有目录,再按提示的数字即可进入相应目录。
-
历史记录
zsh 的历史记录跨 session,可以共享。历史记录支持受限查找。比如,输入git,再按向上箭头,会搜索用过的所有 git 命令。
美化
安装oh-my-zsh, 参考oh-my-zsh, github
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
参加官方主题
选用主题ys
方法, 修改.zshrc
, ZSH_THEME="ys"
, 然后source ~/.zshrc
使命令生效
不建议使用powerlevel10k
(github)等使用特殊字符的主题, 因为客户端需要安装特殊的字体才能配合使用, 否则会显示异常
插件
thefuck
当我们输入命令错误时,输入fuck,终端就会乖乖的给我们正确的指令选择了! 安装方法, 参考thefuck
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
修改配置文件.zshrc
plugins=(... thefuck)
默认快捷键两次ESC, 或者输入fuck
如果安装完, 还出现未安装的情况, 将$HOME/.local/bin
加入环境变量, 修改.zshrc
, export PATH=$HOME/.local/bin:$PATH
autojump
项目主页
git clone https://github.com/wting/autojump.git
cd autojump
python install.py
cd ..
rm -rf autojump
修改配置文件.zshrc
plugins=(... autojump)
使用j 部分路径名
, 即可调到之前的目录, jc 当前目录子目录
, 可以不用全名
查看状态j --stat
, j --purge
删除无效路径
last-working-dir
可以记录我退出终端时所在的路径,再次打开时还在这个路径
git
查看命令alias | grep git
gaa = git add --all
gcmsg = git commit -m
ga = git add
gst = git status
gp = git push
zsh-syntax-highlighting
语法高亮插件
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
zsh-autosuggestions
自动补全建议插件, →
和ctrl+f
自动补全, ctrl+→
补全一个单词
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
提示不是灰色
- 如果颜色不是灰色, 可以参考zsh autosuggestions在tmux环境下高亮问题处理
echo "export TERM=xterm-256color" >> ~/.zshrc
- 还有一种解决方案, 在客户端设置, 如果使用的是
cmder
, 默认会设置TERM=cygwin
, 可以自己设置TERM
为xterm-256color
防止覆盖
setx TERM xterm-256color
extract
自动选择合适的方式解压文件, 使用extract
命令即可
colored-man-pages
彩色的man手册
history-substring-search
git clone https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search
编辑完文件忘记sudo
:w !sudo tee %
也可以, 将以下配置写入 ~/.vimrc
中, 使用 :w!!
重载保存 或者 :W!!
静默保存, 参考stackoverflow
" Silent version of the super user edit, sudo tee trick.
cnoremap W!! execute 'silent! write !sudo /usr/bin/tee "%" >/dev/null' <bar> edit!
" Talkative version of the super user edit, sudo tee trick.
cmap w!! w !sudo /usr/bin/tee >/dev/null "%"
我的配置文件
~/.zshrc
export PATH=$HOME/.local/bin:$PATH
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="ys"
plugins=(
git
pip
thefuck
autojump
last-working-dir
zsh-syntax-highlighting
zsh-autosuggestions
extract
colored-man-pages
history-substring-search
)
source $ZSH/oh-my-zsh.sh
export TERM=xterm-256color
一键安装脚本
curl -fsSL https://raw.githubusercontent.com/lautumn1990/zsh/main/zsh.sh -o zsh.sh && bash zsh.sh
# 如果使用代理
PROXY=socks5://127.0.0.1:1080 && https_proxy=$PROXY curl -fsSL https://raw.githubusercontent.com/lautumn1990/zsh/main/zsh.sh -o zsh.sh && https_proxy=$PROXY bash zsh.sh
grep过滤注释空行
grep -Ev "^$|^[#;]" .zshrc
终端和shell区别
- 命令行界面 (CLI) = 使用文本命令进行交互的用户界面
- 终端 (Terminal) = TTY = 文本输入/输出环境, 通常是硬件, 现在是软件模拟
- 控制台 (Console) = 一种特殊的终端, 直接接在设备上
- Shell = 命令行解释器,执行用户输入的命令并返回结果
区别
现在我们知道,终端干的活儿是从用户这里接收输入(键盘、鼠标等输入设备),扔给 Shell,然后把 Shell 返回的结果展示给用户(比如通过显示器)。而 Shell 干的活儿是从终端那里拿到用户输入的命令,解析后交给操作系统内核去执行,并把执行结果返回给终端。
不过 Shell 与终端的分工有一些容易混淆的地方,这里以例子进行说明:
- 终端将用户的键盘输入转换为控制序列(除了字符以外的按键,比如 左方向键 →
^[[D
),Shell 则解析并执行收到的控制序列(比如^[[D
→ 将光标向左移动); - 不过也有例外,比如终端在接收到
Ctrl + C
组合键时,不会把这个按键转发给当前的程序,而是会发送一个SIGINT
信号(默认情况下,这会导致进程终止)。其他类似的特殊组合键有Ctrl-Z
与Ctrl-\
等,可以通过stty -a
命令查看当前终端的设置。 - Shell 发出类似「把前景色改为红色(控制序列为
\033[31m
)」「显示 foo」等指令;终端接收这些指令,并且照着 Shell 说的做,于是你就看到了终端上输出了一行红色的 foo。 - 除非被重定向,否则 Shell 永远不会知道它所执行命令的输出结果。我们可以在终端窗口中上下翻页查看过去的输出内容,这完全是终端提供的 feature,与 Shell 没有半毛钱关系;
- 命令提示符 (Prompt) 是一个完全的 Shell 概念,与终端无关;
- 行编辑、输入历史与自动补全等功能是由 Shell 提供的(比如 fish 这个 Shell 就有着很好用的历史命令与命令自动补全功能)。不过终端也能自己实现这些功能,比如说 XShell 这个终端模拟器就可以在本地写完一行命令,然后整条发送给远程服务器中的 Shell(在连接状况不佳时很有用,不然打个字都要卡半天);
- 终端中的复制粘贴功能(
Shift + Insert
或者鼠标右键
等)基本上都是由终端提供的。举个例子,Windows 默认的终端对于复制粘贴的支持很屎,而换一个终端(例如ConEmu
)后就可以很好地支持复制粘贴。不过 Shell 以及其他命令行程序也可以提供自己的复制粘贴机制(例如vim
)。