From 502f707d6247af288edabd54b624e13b2aa2392d Mon Sep 17 00:00:00 2001 From: Erystasius Date: Thu, 2 Apr 2026 16:41:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=8C=85=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=EF=BC=8C=E6=8F=90=E5=8F=96=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=87=BD=E6=95=B0=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=85=B3=E8=81=94?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- run_onchange_install-packages.sh | 85 +++++++++++++++++++------------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/run_onchange_install-packages.sh b/run_onchange_install-packages.sh index 62b5dbe..4966006 100644 --- a/run_onchange_install-packages.sh +++ b/run_onchange_install-packages.sh @@ -6,43 +6,62 @@ set -euo pipefail # - 不使用 chezmoi 的 .tmpl 模板语法;通过运行时检测 apt/pacman/dnf。 # - 脚本尽量保持幂等(包已安装会自动跳过)。 -SUDO="" -if [ "$(id -u)" -ne 0 ]; then - if command -v sudo >/dev/null 2>&1; then - SUDO="sudo" - else - echo "需要 sudo 权限才能安装包(当前非 root,且找不到 sudo)。" >&2 - exit 1 - fi -fi +# 包管理器配置 +PACKAGE_LIST="zoxide exa bat fd fd-find ripgrep btop tldr fzf git vim tmux fish fastfetch thefuck" +declare -A UPDATE_COMMAND +declare -A INSTALL_COMMAND +UPDATE_COMMAND=( + [pacman]="pacman -Syu --noconfirm" + [apt]="apt update -y || true" + [dnf]="dnf makecache -y || true" +) +INSTALL_COMMAND=( + [pacman]="pacman -S --noconfirm" + [apt]="apt install -y" + [dnf]="dnf install -y" +) +# 检查 sudo 权限(假设普通用户运行) +if ! command -v sudo >/dev/null 2>&1; then + echo "需要 sudo 权限才能安装包。" >&2 + exit 1 +fi +SUDO="sudo" + +# 安装单个包函数 +install_package() { + local install_cmd="$1" + local package="$2" + if $SUDO $install_cmd "$package" >/dev/null 2>&1; then + echo "安装 $package: ✓ 成功" + else + echo "安装 $package: ✗ 跳过" + fi +} + +# 安装包函数 +install_packages() { + local package_manager="$1" + + echo "检测到 $package_manager,开始安装包..." + echo "更新包..." + $SUDO ${UPDATE_COMMAND[$package_manager]} + echo "开始安装包..." + + for package in $PACKAGE_LIST; do + install_package "${INSTALL_COMMAND[$package_manager]}" "$package" + done + + echo "$package_manager 包安装完成!" +} + +# 主逻辑:检测包管理器并安装 if command -v pacman >/dev/null 2>&1; then - echo "检测到 pacman,开始安装 Arch/Manjaro 包..." - echo "更新系统包..." - $SUDO pacman -Syu --noconfirm - echo "安装 Bash 常用命令增强/替代工具..." - $SUDO pacman -S --noconfirm zoxide exa bat fd ripgrep btop tldr fzf - echo "安装其他常用工具..." - $SUDO pacman -S --noconfirm git vim tmux fish fastfetch thefuck - echo "Arch/Manjaro 包安装完成!" + install_packages "pacman" elif command -v apt >/dev/null 2>&1; then - echo "检测到 apt,开始安装 Debian/Ubuntu 包..." - echo "更新包索引..." - $SUDO apt update -y || true - echo "安装 Bash 常用命令增强/替代工具..." - $SUDO apt install -y zoxide exa bat fd-find ripgrep btop tldr fzf - echo "安装其他常用工具..." - $SUDO apt install -y git vim tmux fish fastfetch thefuck - echo "Debian/Ubuntu 包安装完成!" + install_packages "apt" elif command -v dnf >/dev/null 2>&1; then - echo "检测到 dnf,开始安装 Fedora 包..." - echo "更新包元数据..." - $SUDO dnf makecache -y || true - echo "安装 Bash 常用命令增强/替代工具..." - $SUDO dnf install -y zoxide exa bat fd-find ripgrep btop tldr fzf - echo "安装其他常用工具..." - $SUDO dnf install -y git vim tmux fish fastfetch thefuck - echo "Fedora 包安装完成!" + install_packages "dnf" else echo "未检测到 apt / pacman / dnf,跳过安装。" >&2 fi