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).
这个提交包含在:
JGZYES
2026-09-05 15:01:23 +08:00
父节点 0f86c331bf
当前提交 b7f952e032
修改 2 个文件,包含 46 行新增10 行删除
+23 -5
查看文件
@@ -47,18 +47,36 @@ fi
mkdir -p "$(dirname "$DEST")" mkdir -p "$(dirname "$DEST")"
cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP" cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP"
# ---- 安装完成:提示如何让当前 shell 立即用上新 pmm ---- # ---- 安装完成:检测当前 shell 会解析到哪个 pmm,并给出精确指引 ----
DEST_DIR="$(dirname "$DEST")" DEST_DIR="$(dirname "$DEST")"
case ":$PATH:" in case ":$PATH:" in
*":$DEST_DIR:"*) ;; *":$DEST_DIR:"*) ;;
*) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; *) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;;
esac esac
# 旧 shell 可能把 pmm 命中在已不存在的旧路径(如 ~/.pmm/root/bin/pmm),导致 # bash 可能把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到
# 报 "No such file or directory"。bash 用 `hash -r`、zsh 用 `rehash` # WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v
# 重新按 PATH 解析。子脚本无法清父 shell 的命中缓存,这里尽力清一次并给出提示 # 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作
hash -r 2>/dev/null || true hash -r 2>/dev/null || true
FOUND="$(command -v pmm 2>/dev/null || true)"
echo ""
echo "pmm: 安装完成 -> $DEST" echo "pmm: 安装完成 -> $DEST"
echo "pmm: 若当前 shell 里 pmm 仍不可用/报错,请先执行: hash -r (zsh 用: rehash)"
"$DEST" -v 2>/dev/null || true "$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
+23 -5
查看文件
@@ -47,18 +47,36 @@ fi
mkdir -p "$(dirname "$DEST")" mkdir -p "$(dirname "$DEST")"
cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP" cp "$TMP" "$DEST" && chmod +x "$DEST" && rm -f "$TMP"
# ---- 安装完成:提示如何让当前 shell 立即用上新 pmm ---- # ---- 安装完成:检测当前 shell 会解析到哪个 pmm,并给出精确指引 ----
DEST_DIR="$(dirname "$DEST")" DEST_DIR="$(dirname "$DEST")"
case ":$PATH:" in case ":$PATH:" in
*":$DEST_DIR:"*) ;; *":$DEST_DIR:"*) ;;
*) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; *) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;;
esac esac
# 旧 shell 可能把 pmm 命中在已不存在的旧路径(如 ~/.pmm/root/bin/pmm),导致 # bash 可能把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到
# 报 "No such file or directory"。bash 用 `hash -r`、zsh 用 `rehash` # WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v
# 重新按 PATH 解析。子脚本无法清父 shell 的命中缓存,这里尽力清一次并给出提示 # 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作
hash -r 2>/dev/null || true hash -r 2>/dev/null || true
FOUND="$(command -v pmm 2>/dev/null || true)"
echo ""
echo "pmm: 安装完成 -> $DEST" echo "pmm: 安装完成 -> $DEST"
echo "pmm: 若当前 shell 里 pmm 仍不可用/报错,请先执行: hash -r (zsh 用: rehash)"
"$DEST" -v 2>/dev/null || true "$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