- 开发工具
- CLI
【免费下载链接】oh-my-bash
A delightful community-driven framework for managing your bash configuration, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.
powerbash10k 是 oh-my-bash 内置的一款多彩终端提示符主题,设计灵感来自 zsh 生态的 powerlevel10k,代码则基于 oh-my-bash 的 Brainy 主题重构而来。本文将以 themes/powerbash10k/README.md 为核心骨架,结合 powerbash10k.theme.sh 源码逐段解析其工作原理,覆盖主题启用、Nerd Fonts 前置条件、pb10k动态开关命令、全部主题环境变量以及提示符段落的重排方法,读完即可按需定制出自己的 powerbash10k 提示符。
主题定位与设计来源
官方 README 对 powerbash10k 的定位是一句话:
Simple colorful terminal prompt theme (inspired by powerlevel10k zsh theme, based on Brainy theme).
它继承了 powerlevel10k 的"分段式"提示符设计思路(信息分区块、可独立开关),实现上则源自 oh-my-bash 的 Brainy 主题。主题文件头部的注释也印证了这一点:
# powerbash10k theme for oh-my-bash, inspired by powerlevel10k zsh theme # made by awerebea, based on brainy theme by MunifTanjim与 Brainy 相比,powerbash10k 做了两处显著升级:
- 引入了
cmd_duration段:显示上一条命令的执行耗时(Brainy 没有此段)。 - 默认启用了 SSH/本地会话区分:通过
__PB10K_PROMPT_LOCAL_USER_INFO变量控制本地会话是否显示用户信息。 - 布局从"单行"扩展为"三段式":支持顶左(
__PB10K_TOP_LEFT)、顶右(__PB10K_TOP_RIGHT)、底部(__PB10K_BOTTOM)三个区域的独立编排。
前置条件:Nerd Fonts
powerbash10k 的提示符大量使用 Nerd Fonts 图标(例如目录段前的、Git 分支前的、时钟前的、耗时前的、Python 前的等)。因此 README 明确列出唯一前置条件:
- 安装一款Nerd Font(如 Meslo Nerd Font、FiraCode Nerd Font 等),并在你的终端模拟器中配置该字体。
若终端字体不是 Nerd Font,这些图标将显示为乱码或缺字,提示符的美观性会大打折扣(功能本身不受影响)。
功能特性总览
提示符段落(Prompt Segments)
README 列出的核心段落包括:
| 段落 | 展示内容 |
|---|---|
user_info | 用户名与主机名(Username & Hostname) |
dir | 当前工作目录(Current Directory) |
scm | 源码管理仓库状态(SCM Information,如 Git) |
battery | 电池电量(Battery Charge) |
clock | 当前时间(Clock) |
cmd_duration | 上一条命令的执行时长(Command duration) |
todo | Todo.txt 任务状态 |
ruby | Ruby 环境信息 |
python | Python 环境信息 |
exitcode | 上一条命令的退出码(Exit Code) |
char | 提示符字符(如❯) |
其他特性(Others)
- 缓存 sudo 凭据指示器:检测到当前 shell 已缓存 sudo 凭据时,用户信息段会改变颜色。
- SSH 登录指示器:SSH 会话中强制显示用户信息,本地会话可通过变量隐藏。
pb10k命令:用于即时显示/隐藏各个提示符段落,无需编辑配置文件。
快速启用 powerbash10k
启用主题只需在~/.bashrc中设置OSH_THEME,这一点在 templates/bashrc.osh-template 中有明确示例:
# Set name of the theme to load. OSH_THEME="powerbash10k"如果你使用随机主题模式(OSH_THEME="random"),还可以在~/.bashrc中排除不喜欢的主题,或指定候选列表,模板中已给出包含 powerbash10k 的示例:
# If you set OSH_THEME to "random", you can ignore themes you don't like. OMB_THEME_RANDOM_IGNORED=("powerbash10k" "wanelo") # You can also specify the list from which a theme is randomly selected: OMB_THEME_RANDOM_CANDIDATES=("font" "powerline-light" "minimal")随机主题机制的实现位于 themes/random/random.theme.bash:当OMB_THEME_RANDOM_CANDIDATES已设置时直接以它为候选池,否则扫描全部主题目录并排除random自身及OMB_THEME_RANDOM_IGNORED中列出的主题,最后用RANDOM % ${#_omb_init_themes[@]}挑选一个加载。
三段式提示符的布局原理
powerbash10k 的提示符由三个区域组成(README 的 "Prompt Segments Order" 一节),默认编排如下:
__PB10K_TOP_LEFT="dir scm" __PB10K_TOP_RIGHT="exitcode cmd_duration user_info python ruby todo clock battery" __PB10K_BOTTOM="char"即:
- 顶行左侧:目录 + SCM 状态;
- 顶行右侧:退出码、命令耗时、用户信息、Python、Ruby、Todo、时钟、电池;
- 底行:提示符字符
❯。
实现上,__pb10k_top 函数 先按__PB10K_TOP_LEFT顺序渲染左侧段,再计算终端宽度(tput cols),用黑色·字符把该行填充到终端右缘,随后通过 ANSI 转义序列\033[${terminal_width}G\033[1K\033[1A回到行首并上移一行;接着渲染__PB10K_TOP_RIGHT的右侧各段,用\033[${__TOP_RIGHT_LEN}D光标控制把右段"贴"到最右端——这正是截图里"左目录、右状态"并存的实现细节。__pb10k_bottom 函数 则简单地在换行后输出__PB10K_BOTTOM各段。
最终的 PS1 由 __pb10k_ps1 组合top与bottom,PS2 次提示符使用__PB10K_PROMPT_CHAR_PS2(默认\):
function __pb10k_ps1 { printf "%s%s%s" "$(__pb10k_top)" "$(__pb10k_bottom)" "$_omb_prompt_normal" } function __pb10k_ps2 { local color color=$_omb_prompt_bold_white printf "%s%s%s" "$color" "$__PB10K_PROMPT_CHAR_PS2 " "$_omb_prompt_normal" }主题通过_omb_util_add_prompt_command挂接两个钩子:__pb10k_timer_stop(记录命令耗时)与_omb_theme_PROMPT_COMMAND(重绘 PS1/PS2),见 powerbash10k.theme.sh 末尾。
提示符段落逐段解析
下面结合 powerbash10k.theme.sh 的源码实现,逐段说明每个段落显示什么、依赖什么、颜色如何变化。
user_info:用户信息、sudo 与 SSH 指示器
__pb10k_prompt_user_info 默认显示USER@主机名短名(hostname | cut -d'.' -f1去掉域名后缀):
- sudo 缓存指示器:当
THEME_SHOW_SUDO=true时,执行sudo -n id -u(-n表示非交互、不弹密码),若返回 0 说明当前已缓存 sudo 凭据,用户信息段颜色由默认的bold_olive切换为bold_brown。 - SSH 登录指示器:若存在
SSH_CLIENT环境变量,说明处于 SSH 会话,此时无条件显示用户信息;本地会话则仅当__PB10K_PROMPT_LOCAL_USER_INFO == true时才显示。
dir:当前目录
__pb10k_prompt_dir 以bold_navy显示 \w(Nerd Fonts 文件夹图标 + Bash 的\w转义,即完整工作目录路径)。
scm:SCM 仓库状态
__pb10k_prompt_scm 仅在THEME_SHOW_SCM=true时渲染:检测到 Git 仓库时先输出(Git 图标),再通过scm_prompt_info输出分支信息 <branch>。分支状态符号由主题顶部定义:
export SCM_THEME_PROMPT_PREFIX="" export SCM_THEME_PROMPT_SUFFIX="" export SCM_THEME_PROMPT_DIRTY=" ${_omb_prompt_bold_brown}✗${_omb_prompt_normal}" export SCM_THEME_PROMPT_CLEAN=" ${_omb_prompt_bold_green}✓${_omb_prompt_normal}"即工作区有未提交改动时显示棕色✗,干净时显示绿色✓。底层的scm/scm_prompt_info实现位于 lib/omb-prompt-base.sh,它会依次检测.git/HEAD、git rev-parse --is-inside-work-tree、.hg、.svn来识别仓库类型,并支持通过git config oh-my-bash.hide-status关闭状态检测。
cmd_duration:命令耗时
这是 powerbash10k 相对 Brainy 新增的段落。__pb10k_timer_start 通过trap '__pb10k_timer_start' DEBUG在每条命令执行前记录SECONDS;命令结束后由挂接在 PROMPT_COMMAND 上的__pb10k_timer_stop计算差值。__pb10k_format_duration 将秒数格式化为Nh Nm Ns(小时/分钟/秒),最终由 __pb10k_prompt_cmd_duration 以bold_navy显示 <时长>。
python:Python 环境
__pb10k_prompt_python 在THEME_SHOW_PYTHON=true时调用库函数_omb_prompt_get_python_env(定义于 lib/omb-prompt-base.sh),它会依次探测:
- virtualenv:
VIRTUAL_ENV环境变量(见 _omb_prompt_get_virtualenv); - conda 环境:
CONDA_DEFAULT_ENV(见 _omb_prompt_get_condaenv); - Python 版本:
python --version输出(见 _omb_prompt_get_python_version)。
多个环境并存时用逗号连接并放在括号里,py-前缀会被替换为 Nerd Fonts 的 Python 图标。截图中的.venv激活场景(终端执行activate后提示符出现 Python 环境信息)正是此段的效果。
ruby:Ruby 环境
__pb10k_prompt_ruby 在THEME_SHOW_RUBY=true时显示rb-+ 版本信息,文本用[|]包裹。版本信息来自库函数_omb_prompt_print_ruby_env,其底层 _omb_prompt_get_ruby_env 会依次探测rbfu(RBFU_RUBY_VERSION)、rbenv(rbenv version-name,支持 gemset)、rvm(rvm-prompt)与chruby,见 lib/omb-prompt-base.sh。
todo:Todo.txt 状态
__pb10k_prompt_todo 需要系统中存在todo.sh可执行文件(通过_omb_util_binary_exists todo.sh检测,缺失则直接跳过),然后解析todo.sh ls输出中形如TODO: N of M的任务统计,显示t:<M>。该段默认关闭(THEME_SHOW_TODO=false),只有启用且安装了 Todo.txt CLI 工具才会出现在提示符中。
clock:时钟
__pb10k_prompt_clock 以图标 +date +"$THEME_CLOCK_FORMAT"输出当前时间,颜色取THEME_CLOCK_COLOR。
battery:电池电量
__pb10k_prompt_battery 依赖 oh-my-bash 的 battery 插件(先检查$OSH/plugins/battery/battery.plugin.sh是否存在)。电量百分比来自插件提供的battery_percentage函数,配色规则为:
- 电量 ≥ 50%:绿色;
- 25% ≤ 电量 < 50%:橄榄色;
- 电量 < 25%:棕色;
- 充电中(
ac_adapter_connected返回真)追加+后缀;电量 100% 且充电中显示为AC。
插件实现见 plugins/battery/battery.plugin.sh,它优先使用upower读取电池信息,其次回退到acpi。
exitcode:退出码
__pb10k_prompt_exitcode 仅在退出码非 0 时以bold_red显示✘ <code>(如✘ 1)。截图里执行false后出现的红色退出码即源于此段。
char:提示符字符
__pb10k_prompt_char 根据退出码着色:成功时绿色、失败时红色,内容为__PB10K_PROMPT_CHAR_PS1(默认❯,可用THEME_PROMPT_CHAR_PS1覆盖)。
配置方式一:pb10k命令动态开关
README 提供了两种配置途径,第一种是即时生效的pb10k命令:
pb10k show <segment> pb10k hide <segment>例如pb10k show clock立即显示时钟段,pb10k hide python立即隐藏 Python 段。要点:
- Tab 补全默认启用:主题文件末尾执行了
complete -F __pb10k_completion pb10k(powerbash10k.theme.sh)。补全函数支持的动作是show/hide,可补全的段名为battery clock exitcode python ruby scm sudo todo(见 __pb10k_completion)。 - 生效范围:
pb10k的配置仅对当前 shell 及其后启动的子 shell 生效。这是因为实现上采用export导出环境变量——__pb10k_show 执行export "THEME_SHOW_$seg=true",__pb10k_hide 执行export "THEME_SHOW_$seg=false"。新开的终端会话不会保留这些设置。 - 大小写不敏感:入口函数 pb10k 会先把段名
tr '[:lower:]' '[:upper:]'转为大写再交给 show/hide 函数;传入非show/hide的动作会向 stderr 输出错误并返回 1。
配置方式二:主题环境变量(永久生效)
若要让设置对所有终端会话永久生效,需要在~/.bashrc(或其他 bash 启动文件)中预先定义对应变量。下表完整列出 README 声明的变量及其默认值,并标注了源码 themes/powerbash10k/powerbash10k.theme.sh#L316-L334 中确认的默认值:
| 变量 | README 给出的值 | 源码默认值 | 说明 |
|---|---|---|---|
THEME_SHOW_SUDO | true | true | 是否检测并高亮缓存 sudo 凭据 |
__PB10K_PROMPT_LOCAL_USER_INFO | false(用于隐藏) | true | 本地会话是否显示用户信息;设为false可隐藏(仅 SSH 会话显示) |
THEME_SHOW_SCM | true | true | 是否显示 SCM 仓库状态 |
THEME_SHOW_RUBY | false | false | 是否显示 Ruby 环境 |
THEME_SHOW_PYTHON | false | false | 是否显示 Python 环境 |
THEME_SHOW_TODO | false | false | 是否显示 Todo.txt 状态 |
THEME_SHOW_CLOCK | true | true | 是否显示时钟 |
THEME_CLOCK_COLOR | $bold_cyan(示例) | $_omb_prompt_bold_white | 时钟颜色 |
THEME_CLOCK_FORMAT | "%H:%M:%S" | "%H:%M:%S" | 时钟格式,遵循date命令的格式语法 |
THEME_SHOW_BATTERY | false | false | 是否显示电池电量 |
THEME_SHOW_EXITCODE | true | true | 是否显示退出码 |
两点需要注意的差异:
__PB10K_PROMPT_LOCAL_USER_INFO:README 在 "User Information" 一节将其写为false,语义是"为本地用户隐藏用户信息(只在 SSH 会话显示)";而源码的默认值实为true(${__PB10K_PROMPT_LOCAL_USER_INFO:-"true"}),即默认本地会话也显示用户名。若想达到 README 描述的效果,请在~/.bashrc中显式设置__PB10K_PROMPT_LOCAL_USER_INFO=false。THEME_CLOCK_COLOR:README 给出的$bold_cyan是示例值,源码默认值实际是$_omb_prompt_bold_white(白色);两者都是合法取值,按需覆盖即可。
此外还有两个提示符字符变量(README 未列但源码支持,见 powerbash10k.theme.sh#L328-L329):
__PB10K_PROMPT_CHAR_PS1=${THEME_PROMPT_CHAR_PS1:-"❯"} # 主提示符字符 __PB10K_PROMPT_CHAR_PS2=${THEME_PROMPT_CHAR_PS2:-"\\"} # 续行提示符字符一个典型的永久配置示例(追加到~/.bashrc):
OSH_THEME="powerbash10k" THEME_SHOW_PYTHON=true # 启用 Python 环境显示 THEME_SHOW_RUBY=true # 启用 Ruby 环境显示 THEME_SHOW_BATTERY=true # 启用电池显示(笔记本场景) THEME_CLOCK_FORMAT="%H:%M" # 精简时钟格式 THEME_CLOCK_COLOR=$bold_cyan __PB10K_PROMPT_LOCAL_USER_INFO=false # 本地会话隐藏用户名,仅 SSH 显示重新编排段落顺序
提示符各段的位置并非写死,README 的 "Prompt Segments Order" 一节说明:可用三个环境变量分别定义顶左、顶右、底部的段序列(空格分隔),当前可用的段名共 11 个:
battery char clock cmd_duration dir exitcode python ruby scm todo user_info默认值即:
__PB10K_TOP_LEFT="dir scm" __PB10K_TOP_RIGHT="exitcode cmd_duration user_info python ruby todo clock battery" __PB10K_BOTTOM="char"例如想把用户信息移到最左侧、把时钟从右侧挪到底部,可设置:
__PB10K_TOP_LEFT="user_info dir scm" __PB10K_TOP_RIGHT="exitcode cmd_duration python ruby todo battery" __PB10K_BOTTOM="char clock"底层渲染时,__pb10k_top 会遍历__PB10K_TOP_LEFT/__PB10K_TOP_RIGHT中的每个段名,调用同名函数__pb10k_prompt_<seg>,再用_omb_util_split按空格拆分、按|解析"颜色|文本|前缀|后缀"四元组拼接(见 __pb10k_top_left_parse 与 __pb10k_top_right_parse);某个段函数返回空(如未启用或依赖缺失),该段会自动跳过。
主题源码结构速览
整个主题收敛在单个文件 themes/powerbash10k/powerbash10k.theme.sh 中,按职责可分为五层,便于读者自行阅读与二次开发:
- Helpers(辅助层):
__pb10k_remove_empty_elements(清理空元素)、__pb10k_format_duration(秒数转Nh Nm Ns)、__pb10k_timer_start/stop(配合trap ... DEBUG计时)。 - Parsers(解析层):
__pb10k_top_left_parse/__pb10k_top_right_parse/__pb10k_bottom_parse,把"颜色|内容|前缀|后缀"格式的段信息渲染进对应区域。 - Segments(段实现层):
__pb10k_prompt_<seg>系列函数,每个段落一个函数,遵循"未启用即return 0"的统一约定。 - CLI(命令层):
pb10k show/hide及其 Tab 补全函数__pb10k_completion。 - Variables + Prompt(变量与装配层):变量默认值定义段(L316-L334)以及组装 PS1/PS2 的
__pb10k_ps1/__pb10k_ps2。
使用中的注意事项
- 图标依赖 Nerd Fonts:未安装对应字体时图标会显示异常,这是本主题唯一的硬性前置条件。
- battery 段依赖插件:需要 oh-my-bash 的 battery 插件存在于
$OSH/plugins/battery/battery.plugin.sh,且系统提供upower或acpi工具(见 plugins/battery/battery.plugin.sh)。 - todo 段依赖
todo.sh:未安装 Todo.txt CLI 时该段自动隐藏,不会报错。 pb10k命令不持久化:动态开关只影响当前及子 shell;需要跨会话生效请改用~/.bashrc中的环境变量。sudo检测可能触发缓存刷新:sudo -n id -u使用非交互模式,未缓存凭据时静默失败,不会弹出密码提示,但也意味着它无法"主动"刷新缓存,只反映当前已有状态。
综上,powerbash10k 在 oh-my-bash 中提供了一套"开箱即用、按需裁剪"的多彩分段提示符方案:既有类似 powerlevel10k 的视觉层次,又有pb10k命令带来的即时可调性,同时通过__PB10K_TOP_LEFT/__PB10K_TOP_RIGHT/__PB10K_BOTTOM三变量保留了充分的布局自由度,适合追求信息密度与可定制性的 Bash 用户。
- 开发工具
- CLI
【免费下载链接】oh-my-bash
A delightful community-driven framework for managing your bash configuration, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.
相关推荐
Bash-it Brainy 主题深度指南:多段式彩色提示符的安装、配置与实时切换
Bash it Brainy 主题深度指南:多段式彩色提示符的安装、配置与实时切换 Brainy 是 Bash it 社区框架内置的一款简洁而多彩的终端提示符主
CLIOh My Posh 终端提示符配置完全指南
Oh My Posh 终端提示符配置完全指南 什么是 Oh My Posh Oh My Posh 是一个功能强大的跨平台终端提示符定制工具,它可以让你的命令行界
CLI开发工具在 Bash-it 中接入 Oh-My-Posh:主题桥接原理、POSH_THEME 配置与 Nerd Fonts 实战
在 Bash it 中接入 Oh My Posh:主题桥接原理、POSH_THEME 配置与 Nerd Fonts 实战 本文围绕 Bash it 仓库中的 O
CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考