用zsh增强shell

 

用zsh增强shell

安装

ubuntu 安装 zsh

sudo apt install zsh

如果没有切换zsh, 请用以下命令切换shell

chsh -s $(which zsh)

增强的功能

参考一些命令行效率工具

  1. 补全

    zsh 的命令补全功能非常强大,可以补齐路径,补齐命令,补齐参数等。(请问你记住 tar 的所有参数了吗😃,只要 tar -加 tab 键,再也不用 rtfm 了😂)

    以前杀进程是ps aux | grep xxx查进程的 PID,然后kill PID。有了 zsh,直接kill xxx然后按下 tab 键即可

  2. 别名

    zsh 不仅支持普通 alias,还支持针对文件类型的 alias。

  3. 跳转

    zsh 的目录跳转更为智能,你无需输入cd,直接输入路径即可。..表示后退一级目录,../../表示后退两级,依次类推。(…的作用和../../相同)

    输入d,将列出当前 session 访问过的所有目录,再按提示的数字即可进入相应目录。

  4. 历史记录

    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

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
提示不是灰色
echo "export TERM=xterm-256color" >> ~/.zshrc
  • 还有一种解决方案, 在客户端设置, 如果使用的是 cmder, 默认会设置TERM=cygwin, 可以自己设置 TERMxterm-256color 防止覆盖
setx TERM xterm-256color

extract

自动选择合适的方式解压文件, 使用extract命令即可

colored-man-pages

彩色的man手册

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-ZCtrl-\ 等,可以通过 stty -a 命令查看当前终端的设置。
  • Shell 发出类似「把前景色改为红色(控制序列为 \033[31m)」「显示 foo」等指令;终端接收这些指令,并且照着 Shell 说的做,于是你就看到了终端上输出了一行红色的 foo。
  • 除非被重定向,否则 Shell 永远不会知道它所执行命令的输出结果。我们可以在终端窗口中上下翻页查看过去的输出内容,这完全是终端提供的 feature,与 Shell 没有半毛钱关系;
  • 命令提示符 (Prompt) 是一个完全的 Shell 概念,与终端无关;
  • 行编辑、输入历史与自动补全等功能是由 Shell 提供的(比如 fish 这个 Shell 就有着很好用的历史命令与命令自动补全功能)。不过终端也能自己实现这些功能,比如说 XShell 这个终端模拟器就可以在本地写完一行命令,然后整条发送给远程服务器中的 Shell(在连接状况不佳时很有用,不然打个字都要卡半天);
  • 终端中的复制粘贴功能(Shift + Insert 或者鼠标右键等)基本上都是由终端提供的。举个例子,Windows 默认的终端对于复制粘贴的支持很屎,而换一个终端(例如 ConEmu )后就可以很好地支持复制粘贴。不过 Shell 以及其他命令行程序也可以提供自己的复制粘贴机制(例如 vim)。

参考