---
title: "命令历史"
description: "调好的提示词不该用完就丢：用上下键和 Ctrl+R 找回旧输入，直接读历史文件做统计，并分清历史与会话记录的区别。"
updated: 2026-11-13
canonical: https://docai.cc/learn/command-history/
markdown_mirror: https://docai.cc/learn/command-history.md
---
## 它记的是你发出去的话

送进 [Claude Code](/concepts/claude-code/) 的输入，会被追加到本地的一份记录里；连续两次发送同一句，只留一条。这里存的是提问的原文，模型的回答、命令跑出的结果都不在里面。所以它能回答「我上次是怎么问的」，回答不了「它上次是怎么答的」。

上下键的召回范围按工作目录算：在某个项目里启动，翻到的是这个项目过去会话的输入，别的仓库不会混进来。但记录本身是同一份文件，每行都带着项目路径；想跨项目找，别靠上下键，用 Ctrl+R。具体文件名与存储格式各版本略有差异，先用下面的办法确认自己的环境，再决定怎么整理。

## 两种翻法，先学快的

输入框空着时按上箭头，最后一条先出现；继续按就往更早的方向走，下箭头则朝新的方向移动。翻到某一条可以直接改，改完按回车发出去。

历史一长，箭头就不够用。按 Ctrl+R 进入搜索状态，敲几个字，最近一次匹配会显示出来；再按一次 Ctrl+R 跳到更早的匹配。界面若是全屏渲染，Ctrl+R 会弹出搜索框，用上下键选，按 Ctrl+S 在本次会话、本项目、所有项目之间切换范围。找到之后有两个选择：直接回车立刻发出，或者按 Tab 或 Esc 把它放回输入框，改完再发。想放弃搜索，按 Ctrl+C 取消并恢复原来的输入；搜索词为空时按退格也能退出。内联搜索不区分项目，会翻遍所有工作目录的记录，这是它比上下键强的地方。匹配只看字面包含关系，写更长的关键词比研究正则更省事。

| 想做的事 | 动作 | 结果 |
|---|---|---|
| 翻最近几条 | 上箭头或下箭头 | 逐条查看，可编辑 |
| 找很久以前的 | Ctrl+R 加关键词 | 跳到最近一次匹配，跨项目 |
| 找到后想先改 | Tab 或 Esc | 放回输入框 |
| 不搜了 | Ctrl+C，或删空后按退格 | 退出并恢复原输入 |

## 旧记录翻不到，就直接读文件

箭头只能一条条翻，很早的内容翻起来很慢，也可能已经翻不到了。当前版本的记录放在用户目录的 .claude 文件夹里，文件名叫 `history.jsonl`；Windows 是 `%USERPROFILE%\.claude\history.jsonl`，macOS 与 Linux 在 `~/.claude/history.jsonl`。不同版本可能换过名字，不确定时先把该目录列出来，找名字带 hist 的文件。

每行是一条 JSON，带时间戳和项目路径，用 grep 找关键词，或者用 tail 看末尾若干条都行。结构清楚之后，还能按时间字段筛选、按项目过滤、按天统计条数。这类查询适合回答「上周我问过哪些关于缓存的问题」，比在界面上一条条翻快得多。整理出的高频问法，可以另存成片段文件，下次直接改几个词就能用。

## 历史和会话不是一回事

这是最容易混淆的一处。历史存的是输入文本，找回它只找回了问句，模型并不知道当时聊到哪。要把整段对话接上，得用继续最近对话的参数，或者从会话列表里挑一条恢复；那才会带上先前的问答与工具调用。

判断方法很简单：只想复用措辞，翻历史；想接着上次的思路往下做，恢复会话。前者轻，后者重，用错了要么上下文断裂，要么白白带回一堆无关内容。

## 敏感内容与体积

记录是明文，没有额外加密，保护靠操作系统的文件权限。但只要你曾把密钥、口令、内部地址直接写进提示词，它们就留在这个文件里了。更稳的做法是从一开始就不把秘密写进对话，让程序去读本地的凭据文件；密钥该放在哪、怎么管，可以看 [API Key](/concepts/api-key/) 的说明。

发现已经写进去了，先去服务方撤销那个凭据，再从文件里删掉对应行；只删本地记录而不撤销，等于没处理。按项目清理可以用 `claude purge <项目路径>`，它会把该项目在 history.jsonl 里的记录一并删掉；不想让输入落盘，可以设置 `CLAUDE_CODE_SKIP_PROMPT_HISTORY`，但会话记录也会一起停写。文件太大时检索会变慢，保留最近若干条即可，旧的先备份再截断。共用电脑上还要隔一段时间看一眼权限设置。

## 把好问法沉淀成模板库

搜索只能解决「找回来」，下一步是「下次直接用」。做法不复杂：先从记录里挑出反复出现的问法，再存成独立文件，最后用别名或脚本调用。

```bash
# 1. 找候选：按关键词过滤，只看最近的一部分
grep -i "审查" ~/.claude/history.jsonl | tail -n 30

# 2. 建目录，写模板
mkdir -p ~/.claude/snippets
cat > ~/.claude/snippets/review.md <<'EOF'
请审查下面的改动：
1. 先列会导致错误的问题，再列可读性问题；
2. 每条指出文件与行号；
3. 没有把握的地方明确说不确定。
改动内容：
EOF

# 3. 用管道把模板和代码一起送进去
cat ~/.claude/snippets/review.md src/foo.ts | claude -p

# 4. 常用就设个别名（bash / zsh）
alias cr='cat ~/.claude/snippets/review.md - | claude -p'
```

Windows 的 PowerShell 没有这套别名写法，可以定义一个函数，把模板内容通过管道送进去。模板文件放在用户目录下，换机器时只同步这个目录，不带上整份历史。

记录是每行一个对象的格式时，先看第一条有哪些字段，再决定怎么过滤：

```bash
head -n 1 ~/.claude/history.jsonl | jq .
```

字段名在不同版本里可能是 `prompt`、`display` 或其他名字，以你看到的为准。确认之后先跑最小查询，再叠加条件；例如取出含指定关键词的问句：

```bash
jq -r 'select((.display // .prompt) | tostring | test("缓存")) | (.display // .prompt)' \
  ~/.claude/history.jsonl | tail -n 20
```

把 `test("缓存")` 换成日期或项目路径，就能按时间窗、按目录汇总；条件写得越具体，输出越短。

整理模板时不必追求精确分类。先按动词粗分，把出现两次以上的问法抄进目录，文件名直接用动作命名，例如「审查改动」「补测试」「解释报错」。一个月后再回看，这个目录就是你的常用指令清单，比在几百条记录里反复翻找省事得多。

要接着上次的思路继续，而不是只复用措辞，请用[继续上次对话](/learn/continue-last-conversation/)的方式恢复，别把模板当成上下文。

## 四个常见故障

| 现象 | 为什么 | 怎么办 |
|---|---|---|
| 按上箭头出现 `^[[A` 一类字符 | 行编辑配置被改坏，或终端不识别该序列 | 检查 `~/.inputrc`；临时用 `INPUTRC=/dev/null claude` 启动 |
| 中文显示成乱码 | 终端编码与记录文件的编码不一致 | 用 `locale` 查当前设置，把语言与编码统一到 UTF-8 |
| Ctrl+R 没反应 | 按键被终端或窗口管理器截走 | 换一个终端试；全屏界面下改用弹出的搜索框 |
| Ctrl+S 无法正向搜索 | 终端把该组合键当成暂停输出 | 先执行 `stty -ixon`，再试一次 |

另外两个与体积有关的问题：同时开多个窗口时，旧版本可能互相覆盖记录，升级到当前版本通常能解决，仍不放心就让每个窗口用独立的记录文件；记录只追加不清理，全文检索会越来越慢，轮转时先复制备份并核对行数，确认无误再截断原文件：

```bash
cp ~/.claude/history.jsonl ~/.claude/history.backup.jsonl
wc -l ~/.claude/history.backup.jsonl
tail -n 5000 ~/.claude/history.backup.jsonl > ~/.claude/history.jsonl
```

换电脑时也不要直接覆盖：把旧文件拷过来，与本地文件拼接后再替换，避免丢掉其中一边。拼接前先各留一份备份，确认条数没错再删除旧文件。

## 收束

把常用的问法当资产来管：先会搜，再会整理，最后才谈清理。下一节处理另一种打断节奏的情况——长命令占住对话时怎么让它去后台跑，见[后台 bash 命令](/learn/background-bash-commands/)。
