×−+
会话与环境第 9B 课 · Claude Code 教程
第 9B 课 · SESSIONS & ENVIRONMENTS

会话与环境:
在哪聊,在哪干活

一次对话就是一个"会话":自动存盘,可以回来接着聊,也可以复制一份去试别的思路。Claude 干活的地方也不止你的终端:可以在隔离的副本里、在沙箱里、在云端;你也可以在桌面端、网页甚至手机上看着它干。

约 45 分钟 11 节 · 8 个动手练习 章末测验 改编自 luongnv89/claude-howto(MIT)
你在用
Claude 在哪干活

入门先用起来 原理弄懂为什么 实战动手练 深入进阶与避坑

启动时的 claude -c、claude -r 在第 4 课讲过,这一课讲对话里怎么管会话,以及 Claude 能在哪些地方干活。

01入门

会话:自动存盘的对话

你和 Claude 的每段对话都边聊边存到你的电脑上。关掉终端、甚至 /clear 之后,都能找回来。

  • 存在哪:~/.claude/projects/<项目目录>/<会话 ID>.jsonl,每个项目一个文件夹。默认保存 30 天,可以用 cleanupPeriodDays 设置改。
  • 起个名字:启动时 claude -n auth-refactor,或者对话里 /rename auth-refactor,名字会显示在输入框上方。以后用 claude --resume auth-refactor 或 /resume auth-refactor 直接回来。
  • 不起名也行:Claude Code 会根据你的第一句话自动生成一个标题,在 /resume 的列表里能看到。同时做几件事时,还是起个名字好找。

回来接着聊时,哪些会带回来

会带回来不会带回来
完整的对话记录,包括工具调用和结果后台在跑的命令(第 9A 课)
当时用的模型、子代理身份启动时加的 --mcp-config、--add-dir、--settings 等参数,要重新加
还没过期的固定间隔 /loop 任务(自适应的 /loop 要重新运行)对话中途用 /add-dir 加的目录
权限模式(从终端用 -c 或按名字恢复时;bypassPermissions 和 plan 除外)在 /resume 列表里选的会话:沿用你现在的权限模式

对话里几个顺手的小工具

输入作用
! 开头,如 ! git status自己直接跑一条命令,不经过 Claude 也不用批准。输出进入对话,Claude 会接着解释
/recap一句话总结这个会话做了什么。离开 3 分钟以上再回来,会自动显示一条
/export把整个对话导出成纯文本,拷贝或存成文件
/resume打开会话列表,换到别的对话(和第 4 课的 claude -r 是同一个列表)
/color blue给这个会话的输入框换个颜色,开了好几个终端时一眼分清
02入门

分叉、复制、重开:五个命令

做到一半想换个思路?想让另一份拷贝去试?还是干脆开始新任务?这五个命令对"原来那段对话"的处理各不相同。

对话 auth-refactor 已经进行了 4 轮:① 读代码 ② 定方案 ③ 改登录 ④ 跑测试
你正在用的对话在后台跑已存盘,可以 /resume 回去
命令之后你在哪原来的对话
/branch [名字]在新的副本里原样保留,/resume 能回去
/fork [任务]留在原处继续用;副本在后台自己跑,结果不回来
/subtask 任务留在原处继续用;子代理做完把结果交回来(第 8 课)
/clear [名字]在一段全新的对话里存盘,/resume 能回去
/compact [重点]还是这段对话前面的内容换成一份摘要,腾出上下文

命令行里也能分叉:claude --continue --fork-session。两个终端同时 --resume 同一个会话而不分叉,两边的消息会混在一份记录里。

03入门

练一练:这时候用哪个命令?

每个场景选一个最合适的。

04原理

worktree:给每个会话一张自己的桌子

同一个项目开两个终端,让两个 Claude 同时改代码,它们会改到同一批文件、互相打架。git worktree 给每个会话一份独立的工作目录和分支,共用同一个仓库历史。

my-app/
main
你原来的目录
不受另外两个会话的改动影响
.claude/worktrees/feature-auth/
worktree-feature-auth
终端 1:claude -w feature-auth
改了 src/auth/login.ts
.claude/worktrees/bugfix-123/
worktree-bugfix-123
终端 2:claude -w bugfix-123
改了 src/api/orders.ts
三个目录共用同一个 .git:提交历史、远程仓库、分支列表都是同一套,只是各自检出的分支不同
  • 怎么开:claude --worktree feature-auth(简写 -w)。不给名字会自动起一个,比如 bright-running-fox。对话中也可以直接说"在 worktree 里做"。
  • 从哪开始:默认从远程默认分支(通常是 main)的最新版开新分支,不带你本地没推送的提交。想带上,设置里写 "worktree": { "baseRef": "head" }。
  • .env 没了?worktree 是全新检出,被 git 忽略的文件不会自动带过去。在项目根目录建一个 .worktreeinclude,按 .gitignore 的写法列出 .env 等文件。
  • 记得把 .claude/worktrees/ 加进 .gitignore。子代理也能各用一个 worktree:在它的配置里加 isolation: worktree。

试一试:退出会话时,worktree 会怎样?

05原理

沙箱:给命令围一道墙

权限模式(第 9A 课)是门卫:命令执行前决定放不放、问不问你。沙箱是围墙:命令跑起来以后,由操作系统限制它能写哪些文件、能连哪些网站,连它启动的子进程也一样。

  • 怎么开:对话里输入 /sandbox,选一种模式。设置存进项目的 .claude/settings.local.json;想所有项目都开,在 ~/.claude/settings.json 里写 "sandbox": { "enabled": true }。
  • 默认的墙:能写的只有项目目录、临时目录和你加进来的目录;能读整台电脑(包括 ~/.ssh!);网络一个网站都没预先放行:Manual 模式下第一次连某个网站时问你,auto 模式下由安全员连同命令一起审。
  • 只管 Bash 这类命令:Claude 用 Read、Edit 工具读写文件时,走的还是权限规则;你自己用 ! 打的命令也不在沙箱里。
Windows 用户注意

沙箱支持 macOS、Linux 和 WSL2,不支持原生 Windows。在 Windows 上要用沙箱,先装 WSL2,在里面运行 Claude Code。Linux 和 WSL2 还要先装 bubblewrap 和 socat 两个包,/sandbox 面板会告诉你缺什么。

试一试:同样几条命令,开不开沙箱有什么不同

假设权限模式是 Manual(每步都问你)。切换下面的开关,看每条命令的结果怎么变:

"自动放行":能在墙里跑的命令直接跑,不问你;墙外的事再走正常的权限流程。"照常询问":墙照样在,但每条命令还是先问你。
  • 被墙挡住之后:Claude 会看到被拦的路径或网站,可能申请"在沙箱外重试"。Manual 模式下会弹窗问你;auto 模式下交给安全员判断。不想给它这个选项,设置 "allowUnsandboxedCommands": false。
  • 跑不了的工具:docker 在沙箱里跑不起来,把 "docker *" 加进 sandbox.excludedCommands,让它在墙外按正常权限流程跑。jest 卡住的话,改用 jest --no-watchman。
  • 放行网站要谨慎:放行 github.com 这种大网站,等于给了一条把数据传出去的路。
06原理

离开电脑之后:遥控、云端、桌面端

先想清楚一个问题:Claude 在哪台机器上干活?在你的电脑上,它能用你的文件和工具,但电脑得开着;在云端,合上电脑它也照样干,但用不了你电脑上的工具,代码一般从 GitHub 拉。

Remote Control 远程控制云端会话桌面端
Claude 在哪干活你的电脑Anthropic 的云端虚拟机选 Local 在你的电脑;选 Cloud 在云端
你在哪看、在哪说话手机 Claude App、浏览器 claude.ai/code,终端也能同时用浏览器、手机、桌面端Claude 桌面应用的 Code 标签页
怎么开始终端里 /remote-control,或启动时 claude --rc网页上直接开,或终端里 claude --cloud "任务"下载桌面应用;终端里 /desktop 把当前会话搬过去
电脑要开着吗要,Claude Code 进程得一直运行不用Local 要;Cloud 不用
能用你本地的文件、MCP能不能用本地的 MCP 和工具;代码一般从 GitHub 克隆(仓库没有远程、或没装 GitHub App 时,会把本地仓库打包上传)Local 能
适合在电脑上开了头,出门用手机盯着、回答它的问题长任务、一次开好几个、合上电脑也要继续喜欢图形界面:并排的会话、看改动的 diff、网页预览

在不同地方之间交接

从到怎么做
终端手机 / 浏览器/remote-control:连上后终端里出现 /rc active 标记;再输一次 /remote-control,能看到网址和二维码,手机扫一下就行
终端云端claude --cloud "修复登录 bug":在云端新开一个会话去做,不带上你当前这段对话。云端克隆的是 GitHub 上你当前的分支,先推送本地提交
云端终端claude --teleport 或对话里 /teleport(/tp):拉下分支和完整对话。要求本地没有未提交的改动、同一个仓库、同一个账号
终端桌面端/desktop(macOS 和 x64 Windows)
桌面端云端会话工具栏上的 Continue in 菜单 → Claude Code on the Web
  • 都要用 claude.ai 账号登录(Pro、Max、Team、Enterprise),用 API key 不行。Team、Enterprise 还要管理员先打开。
  • Remote Control 的安全:你的电脑只往外发 HTTPS 请求,不开任何端口。连接期间,对话记录会存在 Anthropic 的服务器上用来同步;执行和文件仍然只在你的电脑上。
  • 桌面端的并行会话:新建会话时勾上 worktree,每个会话就有自己的一份代码(第 4 节讲的)。网页预览的启动方式写在 .claude/launch.json 里。
07实战

输出样式:换一种说话方式

输出样式决定 Claude 怎么跟你说话:啰嗦还是简洁,要不要讲道理,要不要留点代码给你练手。同一个请求,切换看看回答的差别:

my-app — claude

示意:回答内容是虚构的,只为展示各样式的差别。

  • 怎么换:/output-style concise(不分大小写),或 /config 里选 Output style。选择存进 .claude/settings.local.json,下一条消息就生效。
  • 写在设置文件里:"outputStyle": "Concise",这里要区分大小写,写成 concise 会被当成默认样式。
  • Proactive 不改权限:它只是让 Claude 少问"要不要这样做",该弹的权限确认照样弹。

写一个自己的样式

~/.claude/output-styles/diagrams-first.md
---
name: Diagrams first
description: 讲解时先画图
keep-coding-instructions: true
---

讲解代码、架构或数据流时,先画一张 Mermaid 图说明结构,再用文字解释。
图里的节点不超过 15 个。
  • 放在 ~/.claude/output-styles/(只给自己)或项目的 .claude/output-styles/(团队共用)。改了文件要重启 Claude Code 才读到。
  • keep-coding-instructions: true:保留 Claude Code 自带的写代码规范,只改说话方式。不写这行,自定义样式会把那套规范去掉,适合让 Claude 当写作助手、数据分析师这类不写代码的角色。
你想要用
每条回答都换一种语气、长度或格式输出样式
Claude 知道项目的约定、命令和结构CLAUDE.md(第 2 课)
某一类任务的做法,用到时才加载Skill(第 5 课)
某件事每次都必须发生,比如改完就格式化Hook(第 6 课)。输出样式只是指示,不保证执行
08实战

状态栏:输入框下面的一行小字

状态栏是你自己写的一个小脚本。Claude Code 把会话信息(模型、目录、上下文用了多少、花了多少钱……)以 JSON 传给它,它打印什么,底部就显示什么。

最省事的办法:让 Claude 帮你写

对话里输入 /statusline 显示模型名、目录和上下文百分比,它会生成脚本、改好设置。想自己动手,用下面的拼装器。

显示什么
效果
⏺ 登录接口改好了,测试全部通过。 >
~/.claude/settings.json
Claude Code 传给脚本的 JSON(节选,高亮的是你选的字段)
  • bash 版本要先装 jq(解析 JSON 的小工具),并执行 chmod +x ~/.claude/statusline.sh。保存设置后马上生效。设置文件里已经有别的内容时,只把 statusLine 这一段加进去,别整个覆盖。
  • Windows 上:设置里的路径用正斜杠 C:/Users/…,反斜杠会被吃掉,脚本静悄悄地不运行。
  • 它在本地运行,不花 token;每来一条新回复、切换权限模式等时刷新。脚本要快,慢的命令(比如 git status)要缓存。
09实战

终端演练:管好一个会话

在 worktree 里开一个有名字的会话,跑命令、分叉、换输出样式、配状态栏,最后交给手机。点"下一步"回放,放完可以自己输入。

my-app — claude — 90×28
>

终端画面为教学示意,提示文字、会话 ID 和网址是虚构的;命令、参数与官方文档一致。

10深入

进阶与避坑

会话找不到、沙箱开不了、手机连不上……按症状查。

/resume 里找不到昨天的会话
列表默认只显示当前目录(当前 worktree)的会话。按 Ctrl+W 看这个仓库所有 worktree 的,按 Ctrl+A 看这台电脑上所有项目的。claude -p 跑出来的会话不在列表里,要用会话 ID 恢复。超过 30 天的记录会被自动清理。
Windows 上 /sandbox 用不了
沙箱不支持原生 Windows,要在 WSL2 里运行 Claude Code。如果提示 Sandboxing requires WSL2,说明你的发行版还是 WSL1,要升级。
沙箱默认挡不住读 ~/.ssh
默认只限制写,读整台电脑都行。要挡住凭据,用 sandbox.credentials,或者在 sandbox.filesystem.denyRead 里列出 ~/.ssh、~/.aws。公司要强制所有人开沙箱,用管理员下发的设置,加上 "failIfUnavailable": true(开不了就不让启动)。
worktree 里项目跑不起来
worktree 是全新检出:依赖要重新装,.env 这类被 git 忽略的文件不会带过去(用 .worktreeinclude)。用 git lfs install --local 配置的 LFS 文件在 worktree 里是占位文件,进去跑一次 git lfs pull。
手机上连不上 Remote Control
逐个检查:用的是 claude.ai 账号登录而不是 API key;Team、Enterprise 的管理员打开了这个功能;没有设置 ANTHROPIC_BASE_URL 指向代理,也没有设置 DISABLE_TELEMETRY 等关闭功能开关的变量;电脑上的 Claude Code 还开着。/resume、/plugin 这类命令只能在电脑的终端里用。
云端会话里看不到我刚写的代码
claude --cloud 让云端从 GitHub 克隆当前分支,不是你本地的文件。先 git push。反过来 --teleport 拉回本地时,本地不能有未提交的改动,云端的分支也要已经推送。
状态栏不显示
脚本有没有执行权限(chmod +x);是不是打印到了标准输出;手动运行一次看有没有报错,可以用官方的办法喂一段假数据:echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/tmp/my-app"},"context_window":{"used_percentage":25}}' | ~/.claude/statusline.sh。设置了 disableAllHooks 也会关掉状态栏;第一次在这个文件夹用 Claude Code、还没点过信任对话框时,状态栏也会一直空着。
老教程里的写法和官方不一样
  1. claude --remote "任务" 已改名为 --cloud,旧写法还能用,但已弃用。
  2. 没有 claude --sandbox 这个启动参数(它只属于 claude remote-control)。用 /sandbox,或 claude --settings '{"sandbox":{"enabled":true}}'。
  3. 说 macOS 做不到完整的网络隔离:三个平台都由沙箱代理按域名控制网络;enableWeakerNetworkIsolation 只用于一种情况:在 macOS 上配合自建的 TLS 检查代理,让 gh、terraform 这类工具能通过证书验证。
  4. 说换输出样式要 /clear 或新开会话才生效:现在下一条消息就生效。
  5. 说会话回顾只对关闭遥测的用户默认打开:现在所有用户默认打开,在 /config 里关。
  6. 说 worktree 没改动就自动删除:只有没起名字的会话才自动删;起过名字的会问你;-p 跑的从不清理。
  7. 桌面端 .claude/launch.json 的格式:是 configurations 数组,每项写 name、runtimeExecutable、runtimeArgs、port,不是 command、readyPattern。
11检验

小测验

8 道题,每题选完会立刻看到解析。