📌 概述

本文旨在 Windows 平台上基于 Git Bash 构建一套类 Unix 的高效终端环境。通过集成 Zsh (Z Shell)、Oh My Zsh 框架及 Powerlevel10k 主题,解决原生 Git Bash 功能单一、缺乏语法高亮与自动补全等痛点,并实现跨平台(Windows/Linux/Android)的配置统一。


如果目标平台是windows,则需要使用gitbash不建议用msys2作为主要的bash!因为windwos上配置的环境变量在msys2没法使用需要重新配置,容易出现一些问题。但是gitbash本身不支持一些包命令操作和一些快捷的命令,所以需要提前安装好msys2msys2自带了pacman包管理器,可通过pacman -Sy tree安装tree工具等…,至于如何在gitbash上使用msys2自带的pacman就很简单了,只需要在windows上配置msys2的环境变量,可以通过这个软件rapid environment.exe配置,例如D:\msys2\mingw64\bin以及D:\msys2\usr\bin路径。windwos gitbash在执行以下脚本前,建议先把上述环境准备好,然后参考这篇文章

⚙️Widnows Gitbash 环境配置简化流程

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

🚀 方案一:自动化部署脚本 (推荐)

为简化繁琐的依赖安装与环境配置,提供以下全平台通用 Shell 脚本。该脚本支持环境检测、包管理器自动识别、Oh My Zsh 及核心插件的一键安装。

使用方法

此脚本支持 Android Mac Linux Windows

  1. 保存下方代码为 install_zsh.sh
  2. 在 Git Bash 或其他平台目终端中执行:
    chmod +x install_zsh.sh && ./install_zsh.sh 或者 sh install_zsh.sh
#!/bin/bash

# 定义颜色
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW}   Zsh + OMZ + QuickShell 配置脚本    ${NC}"
echo -e "${YELLOW}========================================${NC}"

# ==========================================
# 0. 环境与包管理器检测
# ==========================================
OS_TYPE=$(uname -o 2>/dev/null || uname -s)
INSTALL_CMD=""
UPDATE_CMD=""
SUDO=""

detect_pm_linux_mac() {
    echo -e "${BLUE}检测到 Linux/Mac 环境,请选择包管理器:${NC}"
    echo "1) pkg (Termux)"
    echo "2) apt (Debian/Ubuntu/Kali)"
    echo "3) choco (Linux?)"
    echo "4) pacman (Arch/Manjaro)"
    echo "5) brew (macOS/Linux)"
    read -p "请输入选项 [1-5]: " pm_choice
    case $pm_choice in
        1) INSTALL_CMD="pkg install -y"; UPDATE_CMD="pkg update -y";;
        2) INSTALL_CMD="apt install -y"; UPDATE_CMD="apt update -y"; SUDO="sudo";;
        3) INSTALL_CMD="choco install -y"; UPDATE_CMD="choco upgrade all -y";;
        4) INSTALL_CMD="pacman -S --noconfirm"; UPDATE_CMD="pacman -Sy"; SUDO="sudo";;
        5) INSTALL_CMD="brew install"; UPDATE_CMD="brew update";;
        *) echo "无效,默认 apt"; INSTALL_CMD="apt install -y"; UPDATE_CMD="apt update -y"; SUDO="sudo";;
    esac
}

detect_pm_windows() {
    echo -e "${BLUE}检测到 Windows 环境,请选择包管理器:${NC}"
    echo "1) choco"
    echo "2) pacman (MSYS2)"
    read -p "请输入选项 [1-2]: " pm_choice
    case $pm_choice in
        1) INSTALL_CMD="choco install -y"; UPDATE_CMD="choco upgrade all -y";;
        2) INSTALL_CMD="pacman -S --noconfirm"; UPDATE_CMD="pacman -Sy";;
        *) echo "无效,默认 choco"; INSTALL_CMD="choco install -y"; UPDATE_CMD="choco upgrade all -y";;
    esac
}

# --- 开始 OS 检测 ---
case "$OS_TYPE" in
    *Android*)
        echo -e "${GREEN}-> 检测到 Android 系统 (Termux)${NC}"
        INSTALL_CMD="pkg install -y"
        UPDATE_CMD="pkg update -y"
        ;;
    *Msys*|*Cygwin*|*Mingw*|*Windows*)
        detect_pm_windows
        ;;
    *)
        detect_pm_linux_mac
        ;;
esac

# ==========================================
# 1. 安装基础软件
# ==========================================
echo -e "${GREEN}-> 正在更新源并安装 zsh, git, curl, lsd, bat, fzf...${NC}"

# 执行更新
eval "$SUDO $UPDATE_CMD"

# 执行安装
echo -e "执行安装命令: $SUDO $INSTALL_CMD zsh curl git lsd bat fzf"
eval "$SUDO $INSTALL_CMD zsh curl git lsd bat fzf"

# --- 修复点 1: 刷新命令缓存 ---
# 防止刚安装完 zsh,shell 缓存里还认为没有 zsh
hash -r 2>/dev/null

# 特殊处理:Ubuntu 下 bat 可能叫 batcat
# --- 修复点 2: 兼容性写法 ---
if command -v batcat > /dev/null 2>&1 && ! command -v bat > /dev/null 2>&1; then
    echo "检测到 batcat,创建 bat 别名目录..."
    mkdir -p ~/.local/bin
    ln -s $(which batcat) ~/.local/bin/bat
    export PATH=$HOME/.local/bin:$PATH
fi

# 检查 Zsh 是否安装成功
# --- 修复点 3: 使用 > /dev/null 2>&1 替代 &>,兼容 dash ---
if ! command -v zsh > /dev/null 2>&1; then
    echo -e "${RED}错误:Zsh 安装失败!${NC}"
    echo "调试信息: 尝试手动运行 'zsh --version' 查看是否安装。"
    exit 1
fi

# ==========================================
# 2. 用户交互菜单 (安装模式)
# ==========================================
echo -e "请选择安装模式:"
echo -e "${GREEN}1)${NC} ${RED}全新安装${NC} (删除旧配置)"
echo -e "${GREEN}2)${NC} ${BLUE}保留配置,仅更新${NC}"
echo -e "${GREEN}3)${NC} ${YELLOW}保留配置,强制重装插件${NC}"
read -p "请输入选项 [1-3] (其他键退出): " choice

CLEAN_INSTALL=false
FORCE_RECLONE=false
SKIP_ZSHRC=false

case "$choice" in
    1) CLEAN_INSTALL=true ;;
    2) SKIP_ZSHRC=true; FORCE_RECLONE=false ;;
    3) SKIP_ZSHRC=true; FORCE_RECLONE=true ;;
    *) exit 1 ;;
esac

# ==========================================
# 3. 处理配置文件 (.zshrc)
# ==========================================
# 定义 Quick Shell 目录,适配非 Android 环境
if [[ "$OS_TYPE" == *"Android"* ]]; then
    TARGET_DIR="/sdcard/0.file/shell"
else
    TARGET_DIR="$HOME/quick_shell"
fi

if [ "$CLEAN_INSTALL" = true ]; then
    echo -e "${GREEN}-> 清理旧配置...${NC}"
    rm -rf ~/.zshrc ~/.oh-my-zsh
    
    echo -e "${GREEN}-> 创建 Quick Shell 目录: ${TARGET_DIR}...${NC}"
    mkdir -p "$TARGET_DIR"

    echo -e "${GREEN}-> 生成 ~/.zshrc...${NC}"
    cat > ~/.zshrc << EOF
export ZSH="\$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git zsh-syntax-highlighting zsh-autosuggestions z extract fzf)
source \$ZSH/oh-my-zsh.sh

# 常用别名
alias ls=lsd
alias ll='lsd -l'
alias la='lsd -a'

# Quick Shell 自动加载
QS_DIR="${TARGET_DIR}"
if [ -d "\$QS_DIR" ]; then
    for script in "\$QS_DIR"/*; do
        if [ -f "\$script" ]; then
            filename=\$(basename "\$script")
            alias_name="\${filename%.*}"
            alias "\$alias_name"="bash '\$script'"
        fi
    done
fi
EOF
else
    echo -e "${BLUE}-> 跳过 .zshrc 生成。${NC}"
fi

# ==========================================
# 4. 安装/更新 Oh My Zsh & 插件
# ==========================================
echo -e "${GREEN}-> 处理 Oh My Zsh...${NC}"
export RUNZSH=no
export KEEP_ZSHRC=yes
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

ZSH_CUSTOM=${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}

install_plugin() {
    local url=$1
    local path=$2
    if [ -d "$path" ]; then
        if [ "$FORCE_RECLONE" = true ] || [ "$CLEAN_INSTALL" = true ]; then
            rm -rf "$path"
            git clone --depth=1 "$url" "$path"
        else
            git -C "$path" pull || echo "更新失败"
        fi
    else
        git clone --depth=1 "$url" "$path"
    fi
}

install_plugin "https://github.com/romkatv/powerlevel10k.git" "${ZSH_CUSTOM}/themes/powerlevel10k"
install_plugin "https://github.com/zsh-users/zsh-syntax-highlighting" "${ZSH_CUSTOM}/plugins/zsh-syntax-highlighting"
install_plugin "https://github.com/zsh-users/zsh-autosuggestions" "${ZSH_CUSTOM}/plugins/zsh-autosuggestions"

# ==========================================
# 5. 结尾
# ==========================================
echo -e "${GREEN}-> 设置默认 Shell...${NC}"
if [[ "$OS_TYPE" == *"Android"* ]]; then
    chsh -s zsh
else
    # Linux 上尝试自动切换,如果失败提示手动
    if which zsh > /dev/null 2>&1; then
        chsh -s $(which zsh) || echo -e "${YELLOW}提示:可能需要手动输入密码或运行: chsh -s $(which zsh)${NC}"
    fi
fi

echo -e "${GREEN}安装完成!Quick Shell 目录: ${TARGET_DIR}${NC}"
exec zsh -l

🛠️ 方案二:手动分步部署 (Windows Git Bash)

若需深入控制安装细节,可按以下步骤手动配置。

1. 前置环境准备

组件 作用 获取/配置方式
Git Bash 提供基础 Bash 环境 Git for Windows 官网
MSYS2 提供 Pacman 包管理 MSYS2 官网
环境变量 联通 Git Bash 与 MSYS2 将 MSYS2 的 \usr\bin\mingw64\bin 加入 Windows PATH

注意:配置环境变量后,Git Bash 才能直接识别 pacmanzsh 等命令。

2. 核心组件安装

在配置好 PATH 的 Git Bash 中执行:

# 1. 更新包管理器源
pacman -Syu

# 2. 安装 Zsh 及常用工具 (curl, git, fzf, bat)
pacman -S zsh curl git fzf bat

3. 部署 Oh My Zsh 框架

# 使用 curl 安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

4. 安装核心插件

# 1. Powerlevel10k 主题
git clone "https://github.com/romkatv/powerlevel10k.git" "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"

# 2. 语法高亮 (Syntax Highlighting)
git clone "https://github.com/zsh-users/zsh-syntax-highlighting" "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"

# 3. 自动建议补全 (Autosuggestions)
git clone "https://github.com/zsh-users/zsh-autosuggestions" "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"

cc 配置文件详解

需要修改两个核心文件以完成环境集成。

1. ~/.bash_profile (入口引导)

此配置用于在打开 Git Bash 时自动切换至 Zsh 环境。

# 加载 .bashrc (如果存在)
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# 若为交互式 Shell,则切换至 Zsh
if [ -t 1 ]; then
    export SHELL=/usr/bin/zsh
    exec /usr/bin/zsh
fi

2. ~/.zshrc (核心配置)

集成环境修复、插件管理及网络代理功能。

# --- Powerlevel10k 瞬时提示符 (必须置顶) ---
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

# --- 1. 环境路径修复 (Fix for MSYS2 & Git Bash) ---
export PATH=$PATH:/mingw64/bin:/usr/bin
# 解决 Java/Gradle 等输出乱码问题
export JAVA_TOOL_OPTIONS="-Duser.language=en -Duser.country=US"

# --- 2. Zsh 核心设置 ---
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"

# --- 3. 插件加载 ---
plugins=(
	git                 # Git 缩写
	zsh-syntax-highlighting # 语法高亮
	zsh-autosuggestions # 自动建议
	z                   # 目录跳转
	extract             # 智能解压
	fzf                 # 模糊搜索
)

source $ZSH/oh-my-zsh.sh

# --- 4. 网络代理函数 ---
# 开启代理: setproxy | 关闭代理: unsetproxy
function setproxy() {
    local PROXY_HOST="127.0.0.1"
    local PROXY_PORT="7890" # 按需修改端口
    local PROXY_URL="http://${PROXY_HOST}:${PROXY_PORT}"
    
    export http_proxy="${PROXY_URL}"
    export https_proxy="${PROXY_URL}"
    export all_proxy="socks5://${PROXY_HOST}:${PROXY_PORT}"
    
    # 同步设置 Git 代理
    git config --global http.proxy "${PROXY_URL}"
    git config --global https.proxy "${PROXY_URL}"
    echo "✅ Proxy Enabled: ${PROXY_URL}"
}

function unsetproxy() {
    unset http_proxy https_proxy all_proxy
    git config --global --unset http.proxy
    git config --global --unset https.proxy
    echo "❌ Proxy Disabled"
}

# --- 5. 个性化配置加载 ---
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh

💻 开发环境集成

IDE 集成 (IntelliJ IDEA / VSCode)

为确保 IDE 内置终端正确加载 Zsh 配置,需修改 Shell 启动参数。

  • Shell path: "D:\Program Files\Git\bin\bash.exe" (根据实际安装路径调整)
  • Arguments: -l -c zsh
    • -l (login): 强制作为登录 Shell 启动,确保加载 Profile。
    • -c zsh: 直接执行 zsh 命令。

脚本集成 (.bat 启动)

若需通过 Windows 批处理脚本调用 Zsh 环境执行任务(如启动服务脚本):

@echo off
set GIT_BASH_EXE="D:\Program Files\Git\bin\bash.exe"
set START_SCRIPT="gitlab-start.sh"

:: 启动 Bash -> 切换 Zsh -> 执行脚本 -> 退出
start "" %GIT_BASH_EXE% -c "/usr/bin/zsh -i -c 'source %START_SCRIPT% && exit'"

📱 附录:Android Termux 配置

Termux 环境配置相对精简,主要差异在于路径与别名。

~/.zshrc (Termux 精简版):

export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"

plugins=(git zsh-syntax-highlighting zsh-autosuggestions z extract fzf)

source $ZSH/oh-my-zsh.sh

# 推荐使用 lsd 替代 ls
alias ls=lsd
alias ll='lsd -l'

链接