fix(install.sh): install to the same ~/.pmm/root/bin/pmm used by pmm self-update

installed.sh previously put pmm in /usr/local/bin/pmm (root) or ~/.local/bin/pmm,
while 'pmm install pmm' installs to ~/.pmm/root/bin/pmm — two copies that fight
over which binary runs (the '串' / stale-hash / wrong-version issues). Now it
installs to the SAME path and prepends ~/.pmm/root/bin to PATH in ~/.bashrc, so the
one-line installer and pmm self-update agree; it also detects if a system-level pmm
still resolves first and prints the exact fix.
这个提交包含在:
JGZYES
2026-09-06 10:04:26 +08:00
父节点 32443745ab
当前提交 c30dc72c1b
修改 2 个文件,包含 42 行新增30 行删除
+21 -15
查看文件
@@ -5,7 +5,8 @@
# curl -sSL -o install.sh https://pmm.parlz.com/install.sh && bash install.sh # curl -sSL -o install.sh https://pmm.parlz.com/install.sh && bash install.sh
# 或:curl -sSL https://pmm.parlz.com/install.sh | bash # 或:curl -sSL https://pmm.parlz.com/install.sh | bash
# #
# 下载官方 release 二进制并安装到 /usr/local/bin/pmmroot)或 ~/.local/bin/pmm。 # 下载官方 release 二进制并安装到 ~/.pmm/root/bin/pmm(与 `pmm install pmm` 自升级同一路径,
# 避免 install.sh 与 pmm self-update 两处安装“串”)。
set -e set -e
VER="0.5.3" VER="0.5.3"
REPO="JGZYES/ParlzPackageManger" REPO="JGZYES/ParlzPackageManger"
@@ -38,25 +39,30 @@ fi
echo "" echo ""
chmod +x "$TMP" chmod +x "$TMP"
# ---- 安装 ---- # ---- 安装:装到与 `pmm install pmm`(自升级)相同的唯一路径,防止“串” ----
if [ "$(id -u)" = "0" ]; then # pmm 自装/升级把二进制放在 ~/.pmm/root/bin/pmm,这里也用同一处。
DEST="/usr/local/bin/pmm" DEST="${HOME}/.pmm/root/bin/pmm"
else
DEST="${HOME}/.local/bin/pmm"
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,并给出精确指引 ---- # ---- 安装完成:确保 ~/.pmm/root/bin 在 PATHprepend,并给出精确指引 ----
DEST_DIR="$(dirname "$DEST")" DEST_DIR="$(dirname "$DEST")"
# 写入 ~/.bashrc(若能写),让以后打开的 shell 优先用这个 pmm。
RC="$HOME/.bashrc"
if [ -e "$RC" ] || [ -w "$HOME" ]; then
if ! grep -qF "export PATH=\"$DEST_DIR:" "$RC" 2>/dev/null; then
printf 'export PATH="%s:$PATH"\n' "$DEST_DIR" >> "$RC" 2>/dev/null || true
fi
fi
case ":$PATH:" in case ":$PATH:" in
*":$DEST_DIR:"*) ;; *":$DEST_DIR:"*) ;;
*) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; *) echo "pmm: 当前 shell 请执行: export PATH=\"$DEST_DIR:\$PATH\" && hash -r" ;;
esac esac
# bash 可能仍把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到 # bash 可能仍把 pmm 命中在旧路径(如 /usr/local/bin/pmm 或已删除的路径)。
# WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v # 子脚本清不了父 shell 缓存,但 command -v 能报出“重新解析 PATH 后”会命中哪个 pmm。
# 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作。
hash -r 2>/dev/null || true hash -r 2>/dev/null || true
FOUND="$(command -v pmm 2>/dev/null || true)" FOUND="$(command -v pmm 2>/dev/null || true)"
@@ -70,13 +76,13 @@ if [ -n "$FOUND" ] && [ "$FOUND" != "$DEST" ]; then
echo "pmm: (而不是刚安装的 $DEST)" echo "pmm: (而不是刚安装的 $DEST)"
case "$FOUND" in case "$FOUND" in
/mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;; /mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;;
/usr/local/bin/*) echo "pmm: 它是系统级 pmm 安装(如需彻底清除可 sudo rm $FOUND)。" ;;
esac esac
echo "pmm: 请在当前终端执行下面三条,让 WSL 优先用刚装的 Linux 版:" echo "pmm: 请在当前终端执行下面三条,让 shell 优先用刚装的版"
echo "pmm:" echo "pmm:"
echo "pmm: export PATH=\"$DEST_DIR:\$PATH\"" echo "pmm: export PATH=\"$DEST_DIR:\$PATH\""
echo "pmm: hash -r" echo "pmm: hash -r"
echo "pmm: which pmm && pmm -v" echo "pmm: which pmm && pmm -v"
echo "pmm:" echo "pmm:"
echo "pmm: 永久生效(写入 ~/.bashrc 后 source)" echo "pmm: 已写入 $RC(未含时);新终端无需再设置。"
echo "pmm: echo 'export PATH=\"$DEST_DIR:\$PATH\"' >> ~/.bashrc && source ~/.bashrc"
fi fi
+21 -15
查看文件
@@ -5,7 +5,8 @@
# curl -sSL -o install.sh https://pmm.parlz.com/install.sh && bash install.sh # curl -sSL -o install.sh https://pmm.parlz.com/install.sh && bash install.sh
# 或:curl -sSL https://pmm.parlz.com/install.sh | bash # 或:curl -sSL https://pmm.parlz.com/install.sh | bash
# #
# 下载官方 release 二进制并安装到 /usr/local/bin/pmmroot)或 ~/.local/bin/pmm。 # 下载官方 release 二进制并安装到 ~/.pmm/root/bin/pmm(与 `pmm install pmm` 自升级同一路径,
# 避免 install.sh 与 pmm self-update 两处安装“串”)。
set -e set -e
VER="0.5.3" VER="0.5.3"
REPO="JGZYES/ParlzPackageManger" REPO="JGZYES/ParlzPackageManger"
@@ -38,25 +39,30 @@ fi
echo "" echo ""
chmod +x "$TMP" chmod +x "$TMP"
# ---- 安装 ---- # ---- 安装:装到与 `pmm install pmm`(自升级)相同的唯一路径,防止“串” ----
if [ "$(id -u)" = "0" ]; then # pmm 自装/升级把二进制放在 ~/.pmm/root/bin/pmm,这里也用同一处。
DEST="/usr/local/bin/pmm" DEST="${HOME}/.pmm/root/bin/pmm"
else
DEST="${HOME}/.local/bin/pmm"
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,并给出精确指引 ---- # ---- 安装完成:确保 ~/.pmm/root/bin 在 PATHprepend,并给出精确指引 ----
DEST_DIR="$(dirname "$DEST")" DEST_DIR="$(dirname "$DEST")"
# 写入 ~/.bashrc(若能写),让以后打开的 shell 优先用这个 pmm。
RC="$HOME/.bashrc"
if [ -e "$RC" ] || [ -w "$HOME" ]; then
if ! grep -qF "export PATH=\"$DEST_DIR:" "$RC" 2>/dev/null; then
printf 'export PATH="%s:$PATH"\n' "$DEST_DIR" >> "$RC" 2>/dev/null || true
fi
fi
case ":$PATH:" in case ":$PATH:" in
*":$DEST_DIR:"*) ;; *":$DEST_DIR:"*) ;;
*) echo "pmm: 请将 $DEST_DIR 加入 PATH(或重新登录 shell)" ;; *) echo "pmm: 当前 shell 请执行: export PATH=\"$DEST_DIR:\$PATH\" && hash -r" ;;
esac esac
# bash 可能仍把 pmm 命中在旧路径(如已删除的 ~/.pmm/root/bin/pmm),或命中到 # bash 可能仍把 pmm 命中在旧路径(如 /usr/local/bin/pmm 或已删除的路径)。
# WSL 里 >/mnt/ 下 Windows 侧安装的 pmm。子脚本清不了父 shell 缓存,但 command -v # 子脚本清不了父 shell 缓存,但 command -v 能报出“重新解析 PATH 后”会命中哪个 pmm。
# 能报出“重新解析 PATH 后”会命中哪个 pmm,据此给出精确的三步操作。
hash -r 2>/dev/null || true hash -r 2>/dev/null || true
FOUND="$(command -v pmm 2>/dev/null || true)" FOUND="$(command -v pmm 2>/dev/null || true)"
@@ -70,13 +76,13 @@ if [ -n "$FOUND" ] && [ "$FOUND" != "$DEST" ]; then
echo "pmm: (而不是刚安装的 $DEST)" echo "pmm: (而不是刚安装的 $DEST)"
case "$FOUND" in case "$FOUND" in
/mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;; /mnt/*) echo "pmm: 它在 /mnt/ 下,通常是 Windows 侧安装的 pmm 经由 WSL 的 PATH 被带进来。" ;;
/usr/local/bin/*) echo "pmm: 它是系统级 pmm 安装(如需彻底清除可 sudo rm $FOUND)。" ;;
esac esac
echo "pmm: 请在当前终端执行下面三条,让 WSL 优先用刚装的 Linux 版:" echo "pmm: 请在当前终端执行下面三条,让 shell 优先用刚装的版"
echo "pmm:" echo "pmm:"
echo "pmm: export PATH=\"$DEST_DIR:\$PATH\"" echo "pmm: export PATH=\"$DEST_DIR:\$PATH\""
echo "pmm: hash -r" echo "pmm: hash -r"
echo "pmm: which pmm && pmm -v" echo "pmm: which pmm && pmm -v"
echo "pmm:" echo "pmm:"
echo "pmm: 永久生效(写入 ~/.bashrc 后 source)" echo "pmm: 已写入 $RC(未含时);新终端无需再设置。"
echo "pmm: echo 'export PATH=\"$DEST_DIR:\$PATH\"' >> ~/.bashrc && source ~/.bashrc"
fi fi