69 lines
1.7 KiB
Bash
69 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
# 按存在的包管理器安装依赖包。
|
||
# 说明:
|
||
# - 不使用 chezmoi 的 .tmpl 模板语法;通过运行时检测 apt/pacman/dnf。
|
||
# - 脚本尽量保持幂等(包已安装会自动跳过)。
|
||
|
||
# 包管理器配置
|
||
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"
|
||
[dnf]="dnf makecache -y"
|
||
)
|
||
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
|
||
install_packages "pacman"
|
||
elif command -v apt >/dev/null 2>&1; then
|
||
install_packages "apt"
|
||
elif command -v dnf >/dev/null 2>&1; then
|
||
install_packages "dnf"
|
||
else
|
||
echo "未检测到 apt / pacman / dnf,跳过安装。" >&2
|
||
fi
|
||
|