必须用[和]包裹ANSI颜色序列,否则Bash误算提示符宽度导致光标错乱、编辑异常;正确写法如PS1='[\e[32m]\u@\h:\w[\e[0m]$ ',所有非打印字符都需被明确标记。

直接改 PS1 就能生效,但不加 \[ 和 \] 包裹颜色代码,终端光标会错乱、编辑异常——这是最常被忽略的硬伤。
为什么改完 PS1 后输命令会跳行或删不干净
ANSI 颜色序列(比如 \e[32m)本身不可见,但 Bash 会把它们算进提示符长度。如果不告诉 Bash “这段只是控制字符、不算显示宽度”,它就无法正确计算光标位置。
- 错误写法:
PS1='\e[32m\u@\h:\w\e[0m\$ '→ 光标乱跳、Ctrl+A回到行首失效、长命令换行错位 - 正确写法:
PS1='\[\e[32m\]\u@\h:\w\[\e[0m\]\$ '→\[和\]把非打印字符括起来,Bash 才知道忽略它们的宽度 - 所有颜色、光标移动、标题栏设置等 ANSI 序列,都必须用
\[和\]包裹,否则就是埋雷
想显示完整路径而不是 ~/xxx,该用 \w 还是 \${PWD}
\w 会自动缩写家目录为 ~,这是设计,不是 bug;而 ${PWD} 是实时展开的环境变量,始终输出绝对路径,且不会做任何缩写。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 要“完整路径 + 可读性”:用
\${PWD}最稳,比如PS1='\u@\h:\${PWD}\$ ' - 要“完整路径 + 自动 ~ 缩写”:继续用
\w,它在属于家目录时显示~,超出时显示全路径(如/var/log) - 要“只显示最后一级目录”:用
\W,比如/home/user/project/src显示为src - 注意:
\${PWD}不是转义符,是 Shell 变量展开,所以必须用双引号或混合引号(如"\u@\h:\${PWD}\$ "),单引号里不展开
临时测试和永久生效的区别在哪
临时改只影响当前 shell 进程;永久改要写进配置文件并重新加载,但注意加载时机和作用域。
- 临时生效:直接运行
PS1='\u@\h:\w\$ '(不加export也行),关掉终端就丢 - 永久生效:必须写入
~/.bashrc(普通用户)或/root/.bashrc(root),然后执行source ~/.bashrc - 新打开的终端才读
~/.bashrc;已存在的子 shell 不会自动继承,得手动source - 如果用了
sudo su切 root,可能读的是/root/.bashrc,不是你家目录那个
含命令替换的 PS1 怎么写才不拖慢终端
像 $(date) 或 $(git branch --show-current 2>/dev/null) 这类动态内容,每次显示提示符都会执行一次。耗时操作会卡住输入体验。
- 安全做法:只放毫秒级完成的操作,比如
$(hostname -s)、$(tput setaf 2) - 危险做法:避免
$(curl -s ifconfig.me)、$(find /usr -name "*.so" | head -1)这类网络或磁盘扫描 - Git 分支常用写法:
PS1='\u@\h:\w$(__git_ps1 " (%s)")\$ ',__git_ps1是 Git 自带的轻量函数,比手动调git命令快得多 - 时间类推荐用内置转义符:
\A(HH:MM)比$(date +%H:%M)更高效
真正容易被忽略的,是 \[ 和 \] 的强制包裹规则——哪怕只漏一处,后续所有光标行为都可能失常,而且问题往往延迟暴露,在你换用 tmux、SSH 到旧设备、或者重定向日志时才突然爆发。

















