From b7f952e0327b5286b763c511c7f6f4856fd339a3 Mon Sep 17 00:00:00 2001 From: JGZYES Date: Sat, 5 Sep 2026 15:01:23 +0800 Subject: [PATCH] install.sh: detect which pmm the shell resolves to and give exact fix When WSL inherits a Windows-side pmm (e.g. /mnt/d/.pmm/root/bin) ahead of the fresh install, 'pmm' stays broken/wrong even after an install. The installer now runs 'command -v pmm' and, if it isn't the freshly installed binary, prints the precise 'export PATH=... ; hash -r' steps (and notes if the hit is under /mnt/, i.e. a Windows pmm leaked into WSL's PATH). --- web/download/install.sh | 28 +++++++++++++++++++++++----- web/install.sh | 28 +++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/web/download/install.sh b/web/download/install.sh index 3b9f452..dab487d 100644 --- a/web/download/install.sh +++ b/web/download/install.sh @@ -47,18 +47,36 @@ fi mkdir -p "$(dirname "$DEST")" cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP" -# ---- 安装完成:提示如何让当前 shell 立即用上新 pmm ---- +# ---- 安装完成:检测当前 shell 会解析到哪个 pmm,并给出精确指引 ---- DEST_DIR="$(dirname "$DEST")" case ":$PATH:" in *":$DEST_DIR:"*) ;; *) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; esac -# 旧 shell 可能把 pmm 命中在已不存在的旧路径(如 ~/.pmm/root/bin/pmm),导致 -# 报 "No such file or directory"。bash 用 `hash -r`、zsh 用 `rehash` -# 重新按 PATH 解析。子脚本无法清父 shell 的命中缓存,这里尽力清一次并给出提示。 +# bash 可能仍把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到 +# WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v +# 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作。 hash -r 2>/dev/null || true +FOUND="$(command -v pmm 2>/dev/null || true)" +echo "" echo "pmm: 安装完成 -> $DEST" -echo "pmm: 若当前 shell 里 pmm 仍不可用/报错,请先执行: hash -r (zsh 用: rehash)" "$DEST" -v 2>/dev/null || true + +if [ -n "$FOUND" ] && [ "$FOUND" != "$DEST" ]; then + echo "" + echo "pmm: 注意: 当前 shell 里的 'pmm' 仍会命中: $FOUND" + echo "pmm: (而不是刚安装的 $DEST)" + case "$FOUND" in + /mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;; + esac + echo "pmm: 请在当前终端执行下面三条,让 WSL 优先用刚装的 Linux 版:" + echo "pmm:" + echo "pmm: export PATH=\"$DEST_DIR:\$PATH\"" + echo "pmm: hash -r" + echo "pmm: which pmm && pmm -v" + echo "pmm:" + echo "pmm: 永久生效(写入 ~/.bashrc 后 source):" + echo "pmm: echo 'export PATH=\"$DEST_DIR:\$PATH\"' >> ~/.bashrc && source ~/.bashrc" +fi diff --git a/web/install.sh b/web/install.sh index 3b9f452..dab487d 100644 --- a/web/install.sh +++ b/web/install.sh @@ -47,18 +47,36 @@ fi mkdir -p "$(dirname "$DEST")" cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP" -# ---- 安装完成:提示如何让当前 shell 立即用上新 pmm ---- +# ---- 安装完成:检测当前 shell 会解析到哪个 pmm,并给出精确指引 ---- DEST_DIR="$(dirname "$DEST")" case ":$PATH:" in *":$DEST_DIR:"*) ;; *) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; esac -# 旧 shell 可能把 pmm 命中在已不存在的旧路径(如 ~/.pmm/root/bin/pmm),导致 -# 报 "No such file or directory"。bash 用 `hash -r`、zsh 用 `rehash` -# 重新按 PATH 解析。子脚本无法清父 shell 的命中缓存,这里尽力清一次并给出提示。 +# bash 可能仍把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到 +# WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v +# 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作。 hash -r 2>/dev/null || true +FOUND="$(command -v pmm 2>/dev/null || true)" +echo "" echo "pmm: 安装完成 -> $DEST" -echo "pmm: 若当前 shell 里 pmm 仍不可用/报错,请先执行: hash -r (zsh 用: rehash)" "$DEST" -v 2>/dev/null || true + +if [ -n "$FOUND" ] && [ "$FOUND" != "$DEST" ]; then + echo "" + echo "pmm: 注意: 当前 shell 里的 'pmm' 仍会命中: $FOUND" + echo "pmm: (而不是刚安装的 $DEST)" + case "$FOUND" in + /mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;; + esac + echo "pmm: 请在当前终端执行下面三条,让 WSL 优先用刚装的 Linux 版:" + echo "pmm:" + echo "pmm: export PATH=\"$DEST_DIR:\$PATH\"" + echo "pmm: hash -r" + echo "pmm: which pmm && pmm -v" + echo "pmm:" + echo "pmm: 永久生效(写入 ~/.bashrc 后 source):" + echo "pmm: echo 'export PATH=\"$DEST_DIR:\$PATH\"' >> ~/.bashrc && source ~/.bashrc" +fi