不到100行代码自定义终端状态栏:实时监控Token成本与Git分支
最近在折腾终端开发工具时,发现原生的状态栏信息展示总是差点意思。要么是关键数据(比如 API 成本和上下文占用)藏着掖着,要么是显示一大堆没用的零值,挤占了宝贵的屏幕空间。为了解决这个痛点,我用 Bash 写了一个不到 100 行的轻量级脚本,专门用来优化 Antigravity CLI 的状态栏配置。用下来感觉体验提升非常大,今天就分享给各位兄弟。
这个脚本解决了什么痛点?
平时我们在终端里调用 AI 模型,最关心的无非就是几件事:花了多少钱?Token 够不够用?甚至当前在哪个 Git 分支上写代码? 原始的输出往往是一大坨 JSON,或者干脆只有简单的“Done”。这个脚本通过管道处理 STDIN,把这些枯燥的数据变成了一个直观的、自适应的状态栏。
它的核心优势在于:
- 智能省流:它会自动隐藏那些没有数据的指标。比如你没绑定计费计划,它就不会显示“费用 $0.00”,保持界面极简清爽。
- 大数值自动换算:Token 数动辄几十万甚至上百万,直接看数字容易眼晕。脚本内置了格式化逻辑,自动将 1500 显示为
1.50K,1000000 显示为1.00M,一目了然。 - Git 环境集成:这对我来说是最实用的功能。它能自动读取当前工作目录下的 Git 分支名,直接显示在状态栏里,再也不用在写代码切分支时忘记自己在哪了。
- 上下文可视化:不仅告诉你用了多少百分比,还会直接换算出该模型的总上下文容量(比如
1.05M),让你对还能聊多少字心里有底。
依赖与准备工作
在跑脚本之前,你的环境里得有 jq。这是一个处理 JSON 的神器,大部分 Linux 和 macOS 用户应该都有,如果没有,安装也非常简单:
- Mac (Homebrew):
brew install jq - Ubuntu/Debian:
sudo apt-get install jq
此外,脚本调用了本地的 git 命令,确保你的终端里能用 git 即可。
核心脚本代码:使用jq提取数据并格式化状态栏输出
核心脚本代码与原理解析
把下面的代码保存为 status.sh(或者你喜欢的名字),然后赋予执行权限 chmod +x status.sh。
#!/bin/bash

*状态栏配置效果:直观展示 Token、成本及 Git 分支信息*
# 读取标准输入的数据流
INPUT=$(cat)
# 利用 jq 一次性提取和格式化字段,减少 fork 开销提升性能
eval "$(jq -r '
def format_tokens(val):
if (val == null or val == 0) then "0"
else
(val | tonumber) as $n |
if $n >= 1000000000 then "\(( ($n / 1000000000 * 100 | round) / 100 ))B"
elif $n >= 1000000 then "\(( ($n / 1000000 * 100 | round) / 100 ))M"
elif $n >= 1000 then "\(( ($n / 1000 * 100 | round) / 100 ))K"
else "\($n)"
end
end;
{
model: (.model.display_name // "Unknown"),
cost: (.cost.total_cost_usd // 0),
context_pct: (.context_window.used_percentage // 0),
context_size: format_tokens(.context_window.context_window_size // 0),
limit_pct: (.rate_limits.five_hour.used_percentage // .rate_limits.seven_day.used_percentage // null),
in_tokens: format_tokens(.context_window.total_input_tokens // 0),
out_tokens: format_tokens(.context_window.total_output_tokens // 0),
cwd: (.cwd // ""),
agent: (.agent.name // ""),
plan_tier: (.plan_tier // "")
} | [\
@sh "MODEL=\(.model)",\
@sh "COST=\(.cost)",\
@sh "CONTEXT_PCT=\(.context_pct)",\
@sh "CONTEXT_SIZE_FMT=\(.context_size)",\
@sh "LIMIT_PCT=\(.limit_pct)",\
@sh "IN_TOKENS_FMT=\(.in_tokens)",\
@sh "OUT_TOKENS_FMT=\(.out_tokens)",\
@sh "CWD=\(.cwd)",\
@sh "AGENT=\(.agent)",\
@sh "PLAN_TIER=\(.plan_tier)"\
] | join("\n")
' <<< "$INPUT")"
# 格式化上下文百分比
CONTEXT_FMT=$(LC_NUMERIC=C printf "%.2f" "$CONTEXT_PCT" 2>/dev/null || echo "$CONTEXT_PCT")
# 动态获取 Git 分支名
BRANCH=""
if [ -n "$CWD" ] && [ "$CWD" != "null" ] && [ -d "$CWD" ]; then
BRANCH=$(git -C "$CWD" rev-parse --abbrev-ref HEAD 2>/dev/null)
fi
# 构建分支和代理信息
INFO=""
if [ -n "$BRANCH" ] && [ "$BRANCH" != "null" ]; then
INFO="$INFO │ 🌿 $BRANCH"
fi
if [ -n "$AGENT" ] && [ "$AGENT" != "null" ]; then
INFO="$INFO (👤 $AGENT)"
fi
# 构建账号方案等级显示
PLAN_PART=""
if [ -n "$PLAN_TIER" ] && [ "$PLAN_TIER" != "null" ]; then
PLAN_PART=" │ 🏆 $PLAN_TIER"
fi
# 格式化并条件性显示费用(去除多余尾零)
COST_PART=""
if [ -n "$COST" ] && [ "$COST" != "0" ] && [ "$COST" != "null" ]; then
COST_FMT=$(LC_NUMERIC=C printf "%.6f" "$COST" 2>/dev/null | sed -E 's/(\.[0-9]*[1-9])0+$/\1/; s/\.0+$//' || echo "$COST")
COST_PART=" │ 💰 $COST_FMT"
fi
# 动态配额提示或静态限制提示
QUOTA_PART=""
if [ -n "$LIMIT_PCT" ] && [ "$LIMIT_PCT" != "null" ]; then
LIMIT_FMT=$(LC_NUMERIC=C printf "%.2f" "$LIMIT_PCT" 2>/dev/null || echo "$LIMIT_PCT")
QUOTA_PART=" │ 📊 Quota: $LIMIT_FMT%"
else
# 根据不同的账号方案预设限制提示
if [ "$PLAN_TIER" = "Google AI Pro" ]; then
QUOTA_PART=" │ ⚠️ Limit: 15 RPM / 1.5K RPD"
elif [ "$PLAN_TIER" = "Google AI Studio" ]; then
QUOTA_PART=" │ ⚠️ Limit: 360 RPM / 4M TPM"
fi
fi
# 打印最终格式化输出
printf "🤖 %s%s │ 🧠 Context: %s%% / %s │ In: %s │ Out: %s%s%s%s\n" \
"$MODEL" "$INFO" "$CONTEXT_FMT" "$CONTEXT_SIZE_FMT" "$IN_TOKENS_FMT" "$OUT_TOKENS_FMT" \
"$PLAN_PART" "$COST_PART" "$QUOTA_PART"
如何集成到配置中?
这个脚本设计得很通用,只要有配置项允许自定义状态行(statusLine),基本都能用。通常你需要把脚本的路径填入配置文件中。以 Antigravity 为例,你需要在 config 文件中找到 statusLine 或者类似的配置项,将其指向这个 bash 脚本。
例如,你的配置可能长这样(伪代码示意):
{
"statusLine": "~/.config/antigravity/status.sh"
}
配置完成后,重启你的终端或 CLI 工具,再次发起请求,你就能看到类似下面的效果:
🤖 Gemini Pro │ 🌿 feature/login (👤 dev) │ 🧠 Context: 12.50% / 2.00M │ In: 2.15K │ Out: 850 │ 🏆 Google AI Pro │ 💰 0.000421 │ ⚠️ Limit: 15 RPM / 1.5K RPD
一些使用上的小贴士
脚本里的 Git 分支检测依赖于 cwd(当前工作目录)字段。如果你的 CLI 工具没有把 cwd 传给脚本,那一部分显示就会缺失,可以检查一下输入数据的 JSON 结构。
另外,脚本末尾针对 Google AI Pro 和 Google AI Studio 做了特殊的限额提示硬编码。如果你用的是其他厂商的模型,可以修改脚本的 else 部分,加上对应的 RPM/TPM 限制提醒,这样能更直观地防止触发 429 Too Many Requests 错误。
这个方案虽然简单,但在高频开发场景下,能省去不少回头查账单和看 Context 的精力。如果有更好的优化思路,欢迎在评论区交流!
评论已关闭