首页Shell 提示符生成器

Shell 提示符生成器

拼出 bash 或 zsh 的提示符,一段复制

打开你想要的部分,用户名、主机、当前目录、git 分支、上一条命令的退出码、Python 虚拟环境,再给每个部分挑一个颜色,提示符会即时渲染出来。生成的内容是一段可以直接粘贴到 ~/.bashrc 或 ~/.zshrc 的配置。颜色代码被标记为非打印部分,所以较长的命令行不会在错误的位置换行;离开仓库时 git 分支会自动消失;退出码会在提示符覆盖它之前先被捕获。全部在浏览器中运行,也无需登录。

预设
预览
dev@mbp:~/code/bootsignal (main) $ npm run dev
组成部分
样式
提示符
生成的提示符
# BootSignal prompt, add this to ~/.bashrc
bs_git_branch() {
  local b=$(git branch --show-current 2>/dev/null)
  [ -n "$b" ] && printf ' (%s)' "$b"
}
PS1='\[\e[1;32m\]\u\[\e[0m\]@\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\[\e[1;35m\]$(bs_git_branch)\[\e[0m\] \[\e[1m\]\$\[\e[0m\] '

全部在浏览器中拼装,不会上传任何内容。可以先粘贴到 shell 里试一试,满意后再写进配置文件。

常见问题

这段该放在哪里?
bash 追加到 ~/.bashrc,zsh 追加到 ~/.zshrc,然后执行 source ~/.bashrc 或打开新终端。macOS 上的 bash 通常读取 ~/.bash_profile。
为什么颜色代码要用 \[ \] 包起来?
bash 计算光标位置时会数 PS1 里的每个字符。颜色代码不会显示任何内容,所以必须标记为非打印部分,否则较长的命令行会在错误的位置换行并覆盖提示符。zsh 用 %F 和 %f,本身就按零宽度处理。
git 分支为什么写成函数?
PS1 自己无法做条件判断,所以这个辅助函数在仓库之外什么都不输出,这样就不会留下空括号或多余的分隔符。分支旁边不放分隔符也是同样的原因。
退出码为什么需要 PROMPT_COMMAND?
在 bash 中,提示符里的命令替换会先执行,直接读取 $? 得到的是那次替换的结果。用 PROMPT_COMMAND 先捕获一次,才能保留真正的退出码。zsh 内置 %(?..) 条件转义,不需要这个钩子。
Family Site