你的 bash 历史出卖了你:bash-history-profiler 开发手记
上传你的 ~/.bash_history,它告诉你:你到底是消防员、架构师、摸鱼大师、包工头、偏执狂、数据侠,还是装包狂魔。
为什么要做这个
每个用命令行的人都有自己的"指纹"。有人满屏 kubectl,有人 grep | awk | sed 一管到底,有人 ls && cd && cat 三连装忙。这些习惯藏在 ~/.bash_history 里,几千条命令,自己从不回头看,但它们比任何自我评价都诚实。
我想做一个工具,把这段历史变成一面镜子——不是冷冰冰的统计报表,而是一张"人格画像",带点毒舌,带点幽默,让你看完会心一笑,然后默默 history -c。
设计思路
1. 七种人格
核心创意是"人格画像"。我定义了七种开发者人格,每种对应一组关键词:
| 人格 | emoji | 特征 |
|---|---|---|
| 消防员 | 🚒 | kill、restart、systemctl 刻进肌肉记忆 |
| 架构师 | 🏗️ | docker、kubectl、terraform 搭乐高 |
| 摸鱼大师 | 🐚 | ls、cd、cat、echo 占半壁江山 |
| 包工头 | 🔨 | git、commit、push 三连是一天 |
| 偏执狂 | 🛡️ | chmod、sudo、whoami 权限执念 |
| 数据侠 | 📊 | 管道比命令多,grep awk sed 一管到底 |
| 装包狂魔 | 📦 | apt npm pip yum 人生就是装包 |
每种人格有一段毒舌描述。比如摸鱼大师:
你的终端里,ls、cd、cat、echo 四个命令占了半壁江山。打开终端 ✓,cd 到项目目录 ✓,ls 查看文件 ✓,cat 读一遍配置 ✓——一套流程下来,像极了认真工作的样子。其实你自己都知道:今天的有效产出,约等于零。但没关系,老板看到的是满屏的终端闪烁。
这些描述是手写的,不是 AI 生成的。每一段都反复改过,目标是"笑着认领"而不是"被冒犯"。
2. 评分机制
不是简单的关键词匹配计数。流程是:
def _score_personalities(entries):
# 1. 统计每种人格关键词的命中次数
# 2. 归一化到 0-100
# 3. 取最高分作为主人格
# 4. 置信度 = 主人格分数 / 第二人格分数 的比值
置信度决定描述语气:
- ≥ 80 分:"人设非常稳固,名副其实"
- ≥ 55 分:"画风逐渐清晰,粉墨登场"
- < 55 分:"人格画像尚在演化中,继续折腾,迟早成型"
这样不会出现"你用了两次 git 就是包工头"的荒谬结论。
3. 危险操作检测
除了人格画像,还扫描高危操作:
DANGEROUS_OPS = {
"rm -rf": "☠️ 删库级操作",
"kill -9": "🔪 强杀进程",
"chmod 777": "🚪 全开权限",
"mkfs": "💥 格式化磁盘",
":(){ :|:& };:": "💣 fork 炸弹",
"> /dev/sda": "🧨 直写裸设备",
...
}
每条都用正则匹配,不是简单的字符串包含。比如 rm -rf 的正则:
r"\brm\s+(-[a-z]*r[a-z]*f|-f[a-z]*r|--recursive[^;]*--force|--force[^;]*--recursive)"
这样能匹配 rm -rf、rm -fr、rm --recursive --force 等各种变体,但不会误报 rm file.txt。
检测到高危操作后,slogan 会加一句:
高危操作检出 13 次,建议给手上的服务器买好保险。
4. 命令分类
除了人格,还把命令分到七个大类:运维类、网络类、文件操作类、开发类、数据处理类、系统管理类、包管理类、安全类。每条命令属于哪类靠关键词表查,一个命令可以属于多类(比如 ssh 同时是运维类和网络类)。
分类统计让用户看到自己的"能力分布"——你是全面发展型还是偏科型。
5. 工作时间分析
如果 bash history 带时间戳(HISTTIMEFORMAT 开启的情况下),会分析你的命令在一天 24 小时的分布。凌晨三点还在 git push?工作日和周末的比例?这些数据比你自己记得清楚。
6. Web 界面
用 Flask 做了一个极简 Web 界面,三种输入方式:
- 上传文件 — 直接上传
.bash_history文件 - 粘贴文本 — 复制粘贴命令历史
- 本机分析 — 一键读取本机
~/.bash_history(仅限本地运行)
上传上限 8MB——对 bash history 来说够用了,如果你历史超过 8MB,大概该考虑一下是不是该 history -c 了。
报告页面展示:人格画像卡片 + Top 20 命令 + 危险操作列表 + 分类统计 + 工作时间分布 + 毒舌 slogan。
技术选择
Flask 而不是纯 CLI:因为这个工具的受众是"想看看自己是什么人格"的开发者,Web 界面比 CLI 更有"测试"的感觉。上传文件、等一秒、出结果,体验更像一个小游戏。
只用一个依赖:requirements.txt 里只有 Flask>=2.0。分析引擎 analyzer.py 是纯 Python 标准库,不依赖 Flask。这意味着如果你想把它集成到别的地方,直接 import analyzer 就行。
正则而不是 shell 解析:命令解析用正则表达式提取命令名(第一个 token),不调用 bash 去解析。更快,也更安全——不会意外执行任何东西。
一些数字
analyzer.py:约 420 行,包含 7 种人格定义、12 种危险操作检测、8 种命令分类app.py:30 行,Flask 路由 + 文件上传- 依赖:1 个(Flask)
- 人格描述:手写 7 段,每段 3-4 句,总计约 500 字中文
反思
人格定义是最难的部分。不是技术上难,是"写得准"难。早期版本的"架构师"描述提到了 Kubernetes,后来发现很多运维人也用 kubectl,两 种人格会打架。最后通过关键词去重解决——kubectl 在两种人格里都出现,但架构师还额外有 terraform、helm、docker-compose,这些是运维人不太用的。
毒舌的度很难拿捏。写得太温和不好笑,写得太狠会冒犯人。最后的标准是:如果我自己看到这个描述会笑着认领,那就过关。比如"装包狂魔"的描述里有一句"而真正让你退休的,是那个你三年前装的依赖终于 CVE 爆发"——每个用过 npm 的人都会会心一笑。
正则匹配危险操作值得反复测试。rm -rf 的正则改了三版。第一版太宽松,rm readme.md 也报高危;第二版太严格,rm -rf /(多空格)漏了;第三版用 \s+ 匹配任意空白,才算稳定。
如果重来做的话,会加一个"人格演变"功能——按时间分段,展示"你去年是摸鱼大师,今年进化成了架构师"。不过这需要时间戳数据,很多用户的 bash history 不带时间戳,所以优先级不高。
- 点赞
- 收藏
- 关注作者
评论(0)