1 了解 Shell
1.1 Shell 是什么?
Shell(壳)是操作系统的用户界面,它允许用户与计算机进行交互并执行各种命令。Shell 接受用户输入的命令,并将其解释为操作系统能理解的指令,然后执行这些指令并返回相应的输出结果。
在类 Unix 操作系统中,常见的 Shell 包括 Bash(Bourne Again Shell)、Zsh(Z Shell)、Ksh(Korn Shell)等。每种 Shell 都有自己的特点和功能,用户可以根据自己的喜好和需求选择合适的 Shell 来使用。
Shell 的主要功能包括:
-
命令解释:接受用户输入的命令,并将其解释为操作系统能够执行的指令。
-
环境控制:管理用户的工作环境,包括环境变量、工作目录等。
-
脚本编程:Shell 脚本是一系列命令的集合,可以编写脚本来自动化执行一系列操作。
-
管道和重定向:Shell 允许将命令的输出作为另一个命令的输入,同时支持输出重定向到文件或其他设备。
-
通配符和通配符扩展:Shell 支持使用通配符来匹配文件名,并对通配符进行扩展以匹配多个文件。
1.2 常用 Shell 有哪些?
-
bsh: 原始的Unix shell(Bourne Shell),由Stephen Bourne开发,是许多现代shell的基础。
-
Bash: Bourne Shell的扩展版本,大多数Linux系统的默认shell,功能全面,适合脚本编程和交互式使用。
-
Fish: 用户友好的交互式shell,支持语法高亮、自动建议和现代化特性。
-
Csh: 最早的C语言风格shell,语法类似C语言,通常在一些旧版本的 Unix 系统中使用。
-
Tcsh: Csh的增强版,增加了命令行补全和历史替换等特性。
-
Ksh: 强大的KornShell,提供了命令历史、别名、作业控制和强大的脚本编程能力,广泛用于商业 Unix 系统和一些 Linux 发行版中。
-
Dash: 轻量级的Bourne Shell替代,专为快速启动和低内存使用而优化,通常作为系统脚本的默认shell。
-
Zsh: 高度可定制的shell,支持强大的补全功能、插件和主题,适合高级用户和开发者使用。
关系: Bourne Shell是原始的Unix shell,Bash是其后继者并添加了新功能;Fish、Csh和Tcsh是不同风格和功能的C语言衍生版本;Ksh是另一种流行的衍生版本;Dash是轻量级的Bourne Shell变体;Zsh则是Bourne Shell的现代化扩展。
2 了解 Zsh
2.1 Zsh 是什么?
Zsh(Z Shell)是一种功能强大的 Unix shell,它是 Bourne Shell 的现代化扩展,具有许多增强的功能和特性。Zsh 提供了比标准的 Bourne Shell(sh)和其衍生品 Bash 更多的定制选项和功能,使得它成为了许多 Unix 和类 Unix 系统用户的首选 Shell。
主要功能:
-
高级自动补全:Zsh 提供了强大的命令和文件名自动补全功能,可以根据用户的输入智能地匹配命令、文件名和参数。
-
丰富的插件支持:通过 Oh My Zsh 等框架,Zsh 可以轻松地安装各种插件,提供语法高亮、历史搜索、主题定制等功能。
-
强大的通配符扩展:Zsh 支持更多复杂的通配符模式,用于匹配文件名和路径,比如递归匹配、排除匹配等。
-
定制化程度高:Zsh 允许用户对其行为和外观进行高度定制,包括定制提示符、别名、函数等。
-
模块化:Zsh 是一个模块化的 Shell,它可以加载各种模块来扩展其功能,例如完成源码控制、网络传输等操作。
2.2 安装
在 macOS Catalina(10.15.7)和之后的版本中,默认 shell 已从 Bash 更改为 Zsh,因此新的 macOS 系统通常会推荐或默认使用 Zsh。如果使用的是较旧的 macOS 版本,需要手动安装。
1. 包管理器安装
- Ubuntu:使用 apt 包管理器进行安装,命令为
sudo apt install zsh - Fedora:使用 dnf 包管理器进行安装,命令为
sudo dnf install zsh - macOS:使用 Homebrew 包管理器进行安装,命令为
brew install zsh
2. 官网安装
👉 Zsh 官方网站
2.3 使用
查看系统安装的 Shell
cat /etc/shells
查看当前使用的 Shell
echo $SHELL
切换当前使用的 Shell
chsh -s /shell/path
其中 /shell/path 是要切换到的新 shell 的路径,例如 /bin/zsh、/bin/bash 等。
3 Oh My Zsh
Oh My Zsh 是一款针对 zsh shell 的社区驱动的框架,提供了丰富的主题、插件和配置管理功能,让你可以轻松地定制和管理你的命令行环境。
3.1 安装
curl 命令
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
wget 命令
sh -c "$(wget -qO- https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
fetch 命令
sh -c "$(fetch -o - https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
上述地址安装失败,可替换为以下地址安装
https://github.com/ohmyzsh/ohmyzsh/tree/master/tools/install.sh
3.2 编辑配置文件
安装完成后,可以在终端中使用以下命令来打开 Oh My Zsh 配置文件进行编辑,~/.zshrc 为隐藏文件,使用快捷键 command + shit + . 显示/隐藏系统隐藏文件,或直接运行 open ~/.zshrc 命令打开配置文件。
1. 修改主题
ZSH_THEME="random",主题选择
2. 兼容 Bash 环境变量
.bashrc 和 .zshrc 都是 shell 配置文件,它们分别用于 Bash 和 Zsh。如果想要在使用 Zsh 时也应用 Bash 的配置,可以在 .zshrc 文件中添加 source ~/.bashrc 来实现。当打开一个新的终端窗口或标签页时,也将应用相同的配置。
.bashrc 环境配置
# ===== Java 环境配置 =====
# - JAVA_HOME:指定 JDK 安装路径,用于编译和运行 Java 程序
# - PATH:将 JDK 的 bin 目录加入系统 PATH,确保 java、javac 等命令可用
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-24.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
# ===== Android 开发环境 =====
# - ANDROID_HOME:指定 Android SDK 根目录
# - PATH 添加 emulator:模拟器命令,如启动 AVD
# - PATH 添加 tools:旧版 SDK 工具命令
# - PATH 添加 tools/bin:新版 SDK 工具命令(如 sdkmanager)
# - PATH 添加 platform-tools:平台工具(如 adb、fastboot)
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$ANDROID_HOME/emulator:$PATH
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/tools/bin:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH
# ===== Flutter SDK =====
# - FLUTTER_HOME:Flutter SDK 根目录
# - PATH:将 Flutter 命令加入系统 PATH,可直接运行 flutter 命令
export FLUTTER_HOME=$HOME/Projects/flutter_stable
export PATH=$FLUTTER_HOME/bin:$PATH
# ===== Gradle 构建工具 =====
# - GRADLE_HOME:Gradle 安装路径
# - PATH:将 Gradle 命令加入系统 PATH,可直接运行 gradle 命令
export GRADLE_HOME=/opt/homebrew/opt/gradle
export PATH=$GRADLE_HOME/bin:$PATH
# ===== Python (pyenv) =====
# - PYENV_ROOT:pyenv 根目录
# - PATH:将 pyenv 命令加入 PATH,可使用 pyenv 进行 Python 版本管理
# - eval "$(pyenv init --path)":初始化 PATH 支持,让 shell 知道 pyenv 命令位置
# - eval "$(pyenv init -)":初始化 shell 支持,使 pyenv 可以切换不同 Python 版本
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
# ===== Dart & Flutter 全局工具 =====
# 将 Dart/Flutter 全局可执行文件路径加入 PATH(如 flutterfire_cli、dart pub global run 命令)
export PATH="$PATH:$HOME/.pub-cache/bin"
.zshrc 环境配置
...
ZSH_THEME="ys"
...
# 兼容 bash 相关环境变量
source ~/.bashrc
# 指令自动补全插件
source ~/.oh-my-zsh/custom/plugins/incr/incr*.zsh
3. 重载资源
在修改.zshrc 配置文件后,使用以下命令或者新建终端页面重新加载资源:
source ~/.zshrc
3.3 插件安装及使用
1. 安装插件
1. 使用 Homebrew 安装
brew install autojump
2. 使用 git 安装
Oh My Zsh 的插件目录位于 ~/.oh-my-zsh/plugins。
cd ~/.oh-my-zsh/plugins/
git clone git://github.com/wting/autojump.git ~/.autojump
进入 autojump 目录,并运行安装脚本:
./install.py
2. 启用插件
编辑 .zshrc 配置文件,在 plugins 配置项中添加 autojump 插件,修改后需要重载资源
plugins=(
git
autojump
zsh-autosuggestions
zsh-syntax-highlighting
)
3.4 卸载
1. 运行以下命令来卸载 Oh My Zsh
uninstall_oh_my_zsh
2. 删除用户主目录下的 .oh-my-zsh 目录
rm -rf ~/.oh-my-zsh
3. 删除 .zshrc 配置文件
4 macOS zsh 最佳实践
4.1 macOS Shell 类型
自 macOS Catalina(10.15.7)起,系统默认 shell 已经从 bash 改为 zsh。用户可以通过终端命令 echo $SHELL 查看当前使用的 shell,也可以在 **系统偏好设置 → 用户与群组 → 高级选项(右键用户)**中修改默认 shell。如果系统中没有某个 shell,可以手动安装或创建配置文件,例如在 $HOME 下创建 .zshrc 文件以自定义交互式终端行为。
在 macOS 中,常用的配置文件及加载顺序如下:
文件
加载场景
常用用途
影响范围
.zshenv
所有 shell
必须的环境变量
全局
.zprofile
登录 shell
PATH、全局工具路径
登录终端一次性加载
.zshrc
交互式 shell
alias、PS1、补全、工具初始化
每个终端窗口
.zlogin
登录 shell(稍晚)
登录一次的初始化任务
登录终端一次性加载
.zlogout
退出登录 shell
清理任务、打印信息
登录终端退出时
4.2 macOS Shell 实践
环境变量统一管理
建议将所有跨 shell 需要的环境变量统一写入 .zshenv,例如 PATH、JAVA_HOME、ANDROID_HOME 等。这样无论是登录终端、交互终端还是后台脚本,都会正确读取到环境变量,避免因为不同终端加载顺序造成路径缺失或工具无法运行的问题。
优化加载逻辑
为了提高终端启动速度,建议将重复的 PATH 或环境变量配置合并在 .zshenv 或 .zprofile 中,只在登录终端加载一次。.zshrc 则保留交互体验相关配置,如 alias、Git 提示符、自动补全插件等,避免重复计算和加载,提高每个终端窗口的启动效率。
- 登录终端(Login Terminal):通过用户登录启动的终端,会加载
.zprofile和.zlogin,适合设置一次性全局路径或启动服务。 - 交互式终端(Interactive Terminal):每次打开终端窗口时加载的环境,会加载
.zshrc,适合配置命令别名、提示符、补全插件和主题等交互体验优化。
示例
.zshenv —— 所有 shell 都会加载
加载场景:所有 shell,无论是登录终端、交互终端还是脚本执行
用途:配置必须的环境变量,保证全局可用
# ===============================
# .zshenv - 全局环境变量
# 所有 shell 都会加载,包括脚本和终端
# ===============================
# Java
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-24.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
# Android SDK
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$ANDROID_HOME/emulator:$PATH
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/tools/bin:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH
# Flutter
export FLUTTER_HOME=$HOME/Projects/flutter_stable
export PATH=$FLUTTER_HOME/bin:$PATH
# Gradle
export GRADLE_HOME=/opt/homebrew/opt/gradle
export PATH=$GRADLE_HOME/bin:$PATH
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
.zprofile —— 登录终端加载一次
加载场景:登录终端(Login Shell)
用途:设置 PATH、全局工具路径、一次性初始化任务
# ===============================
# .zprofile - 登录终端专用
# 登录终端启动时加载一次
# ===============================
# 合并 PATH,避免重复
export PATH="$HOME/.pub-cache/bin:$PATH"
# 登录终端启动需要的全局工具初始化
# 可以放一些全局 PATH 或一次性启动的工具配置
.zshrc —— 交互式终端
加载场景:交互式 shell(Interactive Shell)
用途:alias、PS1 提示符、补全插件、主题、工具初始化
# ===============================
# .zshrc - 交互终端专用
# 每个终端窗口都会加载
# ===============================
# 命令别名
alias ll='ls -lah'
alias gs='git status'
# 提示符
export PS1="%n@%m %1~ %# "
# 自动补全
autoload -Uz compinit
compinit
# 插件或工具初始化
# source $HOME/.zshrc.d/plugins.zsh