Skip to content

Commit 48ffbc6

Browse files
committed
🐛 fix: install.sh 保证交互式 shell 的 rc 拿到 PATH
只有 .zprofile 无 .zshrc 的 Mac(Homebrew 只建 .zprofile)旧逻辑一个 rc 都写不到, 且 .zprofile 只在登录 shell 读,tmux/子shell 等非登录交互只读 .zshrc → deepx 不在 PATH。 改为按 $SHELL 保底创建交互式必读 rc:zsh→.zshrc,bash→.bash_profile+.bashrc,fish→config.fish。
1 parent 1e93478 commit 48ffbc6

1 file changed

Lines changed: 34 additions & 7 deletions

File tree

scripts/install.sh

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,13 +329,17 @@ step "Setting up shell PATH"
329329
if echo ":$PATH:" | grep -q ":$BIN_DIR:"; then
330330
success "${BIN_DIR} 已在 PATH"
331331
else
332-
# 选 rc 文件:优先 SHELL 当前,fallback 都加一份
332+
# 选 rc 文件。两步走:
333+
# (1) append_rc:往所有【已存在】的 rc 追加一份,belt-and-suspenders(用户常多 shell 混用)。
334+
# (2) ensure_rc:按当前 $SHELL 保证【交互式 shell 必读】的那个 rc 存在且含 PATH(缺则创建)。
335+
# 为什么需要 (2):旧逻辑"文件不存在就跳过"会让"只有 .zprofile、没 .zshrc"的 Mac(Homebrew
336+
# 引导只建 .zprofile)一个 rc 都写不到 → deepx 装了却不在 PATH。而且 .zprofile 只在登录 shell 读,
337+
# tmux / 子 shell / 手敲 zsh 这类非登录交互只读 .zshrc —— 所以落点必须是覆盖全交互场景的 .zshrc。
333338
LINE='export PATH="'"$BIN_DIR"':$PATH"'
334339
append_rc() {
335340
local rc="$1"
336341
# 注意:必须 return 0。裸 return 会带回上一条命令([ -f ])的退出码,
337-
# 文件不存在时即 1,在 set -e 下会让整个安装在第一个不存在的 rc(常见是 .zshrc)处中止,
338-
# 导致 PATH 从未写入、deepx 装了却不在 PATH。Mac 默认有 .zshrc 故不暴露,Linux 必中。
342+
# 文件不存在时即 1,在 set -e 下会让整个安装在第一个不存在的 rc 处中止。
339343
[ -f "$rc" ] || return 0
340344
if grep -Fq "$BIN_DIR" "$rc"; then
341345
info "PATH 已在 $(basename "$rc") 配过"
@@ -344,16 +348,39 @@ else
344348
printf "\n# deepx\n%s\n" "$LINE" >> "$rc"
345349
success "已加入 $(basename "$rc")"
346350
}
351+
# 缺则创建:保证这个 rc 一定拿到 PATH。
352+
ensure_rc() {
353+
local rc="$1"
354+
if [ -f "$rc" ] && grep -Fq "$BIN_DIR" "$rc"; then
355+
info "PATH 已在 $(basename "$rc") 配过"
356+
return 0
357+
fi
358+
printf "\n# deepx\n%s\n" "$LINE" >> "$rc"
359+
success "已写入 $(basename "$rc")"
360+
}
347361
append_rc "$HOME/.zshrc"
362+
append_rc "$HOME/.zprofile"
348363
append_rc "$HOME/.bashrc"
349364
append_rc "$HOME/.bash_profile"
350365
# Linux 桌面环境(sddm/gdm/lightdm)通常走 .profile 而非 .bashrc
351366
append_rc "$HOME/.profile"
352367

353-
# fish:不同语法
368+
# 按当前 shell 保底:确保"交互式 shell 必读的 rc"存在(缺则建)。
369+
# zsh → .zshrc:登录+非登录交互都读,覆盖 Terminal/iTerm/tmux/子shell/VSCode(默认登录)
370+
# bash → .bash_profile(mac 登录 shell 读)+ .bashrc(非登录交互读),两个都要
371+
# fish → 交给下面的 config.fish 专段(语法不同)
372+
case "$(basename "${SHELL:-sh}")" in
373+
zsh) ensure_rc "$HOME/.zshrc" ;;
374+
bash) ensure_rc "$HOME/.bash_profile"; ensure_rc "$HOME/.bashrc" ;;
375+
fish) : ;;
376+
*) ensure_rc "$HOME/.profile" ;;
377+
esac
378+
379+
# fish:不同语法。$SHELL 是 fish 时缺文件也要建(同 zsh/bash 的保底);否则仅在已存在时追加。
354380
FISH_CFG="$HOME/.config/fish/config.fish"
355-
if [ -f "$FISH_CFG" ]; then
356-
if grep -Fq "$BIN_DIR" "$FISH_CFG"; then
381+
if [ "$(basename "${SHELL:-sh}")" = fish ] || [ -f "$FISH_CFG" ]; then
382+
mkdir -p "$(dirname "$FISH_CFG")"
383+
if [ -f "$FISH_CFG" ] && grep -Fq "$BIN_DIR" "$FISH_CFG"; then
357384
info "PATH 已在 config.fish 配过"
358385
else
359386
printf "\n# deepx\nfish_add_path %s\n" "$BIN_DIR" >> "$FISH_CFG"
@@ -387,7 +414,7 @@ echo " 下一步:"
387414
echo " ⚠ 当前 shell 还没拿到新 PATH(子进程改不了父进程环境)。任选其一让它生效:"
388415
echo " exec \$SHELL # 推荐:换个新 shell 替代当前(README 推荐的装命令已自动做这件事)"
389416
echo " source ~/.bashrc # 或:bash 用户重读 rc"
390-
echo " source ~/.zshrc # 或:zsh 用户重读 rc"
417+
echo " source ~/.zshrc # 或:zsh 用户重读 rc(登录 shell 也可 source ~/.zprofile)"
391418
echo " source ~/.config/fish/config.fish # 或:fish"
392419
echo ""
393420
echo " 新开的 terminal 自动生效,不用做任何事。"

0 commit comments

Comments
 (0)