#!/bin/bash # ============================================================== # NVM 部署脚本 - 一键安装 nvm + Node.js LTS 稳定版 + 换源加速 # ============================================================== # 适用系统: Ubuntu 20.04+ # 说明: 使用国内镜像源加速,避免 GitHub raw 下载缓慢 # 安装 Node.js LTS 版(比 latest 更小更快) # # 注意:脚本可能通过 sudo 以 root 身份执行, # 因此需要检测原始用户并切换到该用户安装 nvm, # 避免 nvm 装到 /root 下导致原用户看不到。 # ============================================================= set -e echo "========================================" echo " NVM 部署脚本 - 开始安装..." echo "========================================" # ---------- 检测原始用户 ---------- # 如果通过 sudo 运行,SUDO_USER 会保留原用户名 if [ -n "$SUDO_USER" ]; then REAL_USER="$SUDO_USER" REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6) if [ -z "$REAL_HOME" ]; then REAL_HOME="/home/$REAL_USER" fi else REAL_USER=$(whoami) REAL_HOME="$HOME" fi echo " 检测到实际用户: $REAL_USER" echo " 用户目录: $REAL_HOME" echo "" NVM_VERSION="v0.39.7" NODE_LTS_VERSION="--lts" # 安装 LTS 最新版(比 install node 的 latest 版更小) # ---------- 辅助函数:以原始用户身份执行命令 ---------- run_as_user() { if [ "$(whoami)" != "$REAL_USER" ]; then sudo -u "$REAL_USER" bash -c "$*" else bash -c "$*" fi } # 1. 安装 nvm(使用 gitee 镜像加速) echo "[1/4] 正在安装 nvm ${NVM_VERSION}..." # 优先用 gitee 镜像(国内快),失败则回滚到 GitHub 官方 NVM_INSTALL_URL="https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/install.sh" echo " 下载源: ${NVM_INSTALL_URL}" # 以原始用户身份下载并执行安装脚本 rm -f /tmp/install_nvm.sh if timeout 30 curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh 2>/dev/null; then echo " ✅ 从 Gitee 镜像下载成功" else echo " ⚠ Gitee 镜像下载失败,切换到 GitHub 源..." NVM_INSTALL_URL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh fi # 以原始用户身份执行安装(不要用 sudo) chown "$REAL_USER":"$REAL_USER" /tmp/install_nvm.sh 2>/dev/null || true sudo -u "$REAL_USER" bash /tmp/install_nvm.sh rm -f /tmp/install_nvm.sh # 2. 加载 nvm 到当前 shell(以原始用户身份) echo "[2/4] 正在加载 nvm 环境变量..." export NVM_DIR="$REAL_HOME/.nvm" if [ -s "$NVM_DIR/nvm.sh" ]; then \. "$NVM_DIR/nvm.sh" echo " nvm 已加载" else echo " ⚠ nvm.sh 未找到,可能安装过程中出现问题" ls -la "$NVM_DIR" 2>/dev/null || echo " .nvm 目录不存在" fi # 3. 配置淘宝镜像源(加速 Node.js 下载) echo "[3/4] 正在配置淘宝镜像源..." echo 'export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node' >> "$REAL_HOME/.bashrc" export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node echo " 镜像源已配置: NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node" # 4. 安装 Node.js LTS 版 echo "[4/4] 正在安装 Node.js LTS 版本(稳定版)..." echo " 下载源: ${NVM_NODEJS_ORG_MIRROR}" # nvm install 必须以原始用户身份执行,否则 $NVM_DIR 不匹配 sudo -u "$REAL_USER" bash -c " export NVM_DIR='$REAL_HOME/.nvm' [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" export NVM_NODEJS_ORG_MIRROR='$NVM_NODEJS_ORG_MIRROR' nvm install $NODE_LTS_VERSION " # 验证安装结果 echo "" echo "========================================" echo " 安装完成!验证信息如下:" echo "========================================" # 以原始用户身份验证 sudo -u "$REAL_USER" bash -c " export NVM_DIR='$REAL_HOME/.nvm' [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" if command -v nvm &> /dev/null; then echo ' nvm 版本 : \$(nvm --version)' else echo ' nvm 版本 : n/a' fi if command -v node &> /dev/null; then echo ' node 版本: \$(node -v)' else echo ' node 版本: n/a' fi if command -v npm &> /dev/null; then echo ' npm 版本 : \$(npm -v)' else echo ' npm 版本 : n/a' fi echo '' echo ' 当前默认使用的 Node 版本:' nvm ls 2>/dev/null || echo ' nvm ls 不可用' " echo "" echo "========================================" echo " 提示:重新登录终端或执行:" echo " source ~/.bashrc" echo " 然后: nvm --version" echo "========================================"