一、简介

zsh是一种Unix shell,类似于bash、sh、csh等命令行解释器。它是一种交互式的shell,可以让用户在终端中输入命令并与操作系统进行交互。zsh最初是为了扩展bash的功能而创建的,但现在已经成为了一种很受欢迎的 shell。

与 bash 相比,zsh 有许多优点,其中包括:

自动补全:zsh 的自动补全功能比 bash 更强大。它可以根据当前光标位置和历史记录,自动推测出用户想输入的命令或参数,极大地提高了操作效率。
主题和插件:zsh 具有丰富的主题和插件库,用户可以通过这些扩展来改善其外观和功能。
强大的别名:zsh 支持复杂的别名,这些别名可以包含参数、条件和内嵌命令。
可定制性:zsh 允许用户自定义其外观、行为和键绑定,以满足个人偏好和需求。
强大的历史命令:zsh 的历史命令比 bash 更强大,可以实现更高级的搜索和过滤功能。

二、安装

运行如下命令即可安装。

apt install git zsh -y

刚安装的 zsh 是极其朴素的,并且功能也比较弱。所以需要安装 oh-my-zsh,它提供了一套预配置的 Zsh 配置文件、主题和插件,这样可以轻松地定制和管理 zsh。

curl 安装

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# wget 安装
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# fetch 安装
sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

卸载

uninstall_oh_my_zsh

以上命令选择一条运行进行安装 zsh,如果网络不好可能无法下载,毕竟是 github,这个时候找一台可以访问脚本的机器把内容复制到新建的脚本,再进行安装也是可以的。 三、配置

所有的配置修改后都需要执行:

source ~/.zshrc
  1. 其他配置

为了更好的使用 zsh 的功能,准备将历史记录的条数增大一点,编辑 ~/.zshrc 文件,添加如下内容。

修改zcompdump生成的文件目录

source /etc/profile
export ZSH_COMPDUMP=$ZSH/cache/.zcompdump-$HOST

记录历史命令的文件

HISTFILE=~/.history

内存中记录历史命令条数

HISTSIZE=10000

历史文件中保存的历史命令数

SAVEHIST=10000

不同的终端会话历史命令合并到同一历史文件

setopt appendhistory

在source $ZSH/oh-my-zsh.sh之前配置升级相关内容

始终回复否从不升级,可以通过 omz update 进行更新

DISABLE_AUTO_UPDATE=true

始终回复是并自动升级

#DISABLE_UPDATE_PROMPT=true

使用 history -f 可以查看命令运行的时间。 2. 修改主题

zsh 有很多主题可选择,主题链接:https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

选择 ~/.zshrc 文件,修改主题名称即可。

#ZSH_THEME="robbyrussell"
ZSH_THEME="agnoster"

这里可能报错:

    (anon):12: character not in range

在 ~/.zshrc 文件添加如下内容即可:

export LC_ALL=C.UTF-8
export LANGUAGE=C.UTF-8
export LANG=C.UTF-8

此外,可能还需要修改命令行的用户名或主机名。

全部隐藏

prompt_context(){}

只隐藏主机

prompt_context() {
  if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
    prompt_segment black default "%(!.%{%F{yellow}%}.)$USER"
  fi

}

只隐藏用户名

prompt_context() {
  if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
    prompt_segment black default "%(!.%{%F{yellow}%}.)$HOST"
  fi

}

还可以限制显示的目录数,比如最大只显示三个:

prompt_dir() {
   prompt_segment blue $CURRENT_FG '%3~'
}
  1. 添加插件

插件列表:https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins-Overview

这里只安装比较重要的两个插件:

zsh-autosuggestions插件:根据已经输入的命令,自动显示可能的补全建议
zsh-syntax-highlighting插件:高亮显示命令行语句

安装 zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

安装 zsh-syntax-highlighting

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting 

然后编辑 ~/.zshrc 文件,找到 plugins 选项:

plugins=(
        zsh-autosuggestions
        zsh-syntax-highlighting
        docker
        z
        per-directory-history
        colored-man-pages

)
  1. 命令别名

以下是我的重命名,请根据自己需要进行设置。

# systemctl
alias syse='sudo systemctl enable --now'
alias sysd='sudo systemctl disable --now'
alias sysr='sudo systemctl restart'
alias syss='sudo systemctl status'
 
# tmux
alias tl='tmux ls'
alias tlw='tmux list-windows'
alias tlp='tmux list-panes'
alias tka='tmux kill-server'
alias tks='tmux kill-session'
alias ta='tmux a -t dev || tmux new -t dev'
 
# docker
alias dp='docker ps'
alias dr='docker restart'
alias dl='docker logs'  
alias dlf='docker logs -f'
alias dei='docker exec -it'
alias din='docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}"'
alias runlike='docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike -p'
# 清理相关
alias dsd='docker system df'
alias dcp='docker container prune'
alias dvp='docker volume prune'
alias dip='docker image prune'
alias dsp='docker system prune'
alias dspa='docker system prune -a'
 
# other
alias dh='du -h ./ -d 1' # 查看当前目录占用
alias psg='ps aux | grep' 
alias ng='netstat -autnp | grep'
alias wget='wget -c' # 支持断点续传
alias now='date "+%Y-%m-%d %H:%M:%S"' # 查看并格式化当前时间
alias size='f(){ du -sh $1* | sort -hr; }; f' # 查看文件/目录大小 - size /
alias sek='f(){ find / -name $1; }; f' # 在根目录查找文件 - sek test
alias sekc='f(){ find ./ -name $1; }; f' # 在当前目录查找文件 - sekc test
alias ipe='curl ipinfo.io/ip' #  查看当前公网ip