花了将近两周时间把 OpenClaw 的命令行基础过了一遍,我最大的感受是:图形界面只是它的脸,命令行才是它真正的手脚。很多同学装上 OpenClaw 之后第一反应是找可视化面板,点按钮、看聊天窗,觉得这样就叫"会用"了。但等你真正要批量处理文档、定时跑任务、把 AI 接进自己的脚本工作流时,图形界面就会变得非常碍事——这时候命令行就是你绕不开的入口。
这篇是这个系列的第三篇,专门讲 OpenClaw 命令行里最常用的指令和参数。我会把我自己在实际项目里用到的命令原样列出来,每条都解释为什么这么用、参数背后的逻辑是什么,以及哪些地方容易踩坑。如果你是刚接触命令行的小白,看完这篇至少能独立完成"启动会话、跑一个任务、查看结果、续接上下文"的完整闭环;如果你已经有一定基础,可以直接跳到后面的参数优先级和踩坑记录,那几段写的是常规文档里不会说的东西。
1. OpenClaw 命令行到底解决了什么问题
1.1 图形界面够用,但一定不够深
先说清楚一件事:OpenClaw 的图形界面做得并不差,会话、记忆、技能管理都有可视化入口。但我用了一段时间后发现,凡是重复性高、需要批量处理的操作,图形界面几乎都要点好几下鼠标才能完成。比如我想把某文件夹里的 20 个 Markdown 文件逐一出给模型做摘要,图形界面的操作路径是:打开面板 → 新建会话 → 上传文件 → 等结果 → 复制保存 → 再新建会话……循环 20 次。而命令行只需要一条for循环命令加上管道,几分钟全部搞定。
这不是 OpenClaw 特有的问题,而是所有 AI 工具共性的选择:图形界面优化的是"单次体验",命令行优化的是"批量效率"。你在学习阶段当然可以只用面板,但只要你想把 OpenClaw 嵌入到自己的脚本、定时任务、甚至是 CI 流程里,命令行就是唯一的选择。
1.2 命令行的真正优势:可写、可重复、可交接
命令行的优势总结下来有三点,这三点是图形界面永远做不到的:
- 可写:操作记录天然就是文本,今天跑了什么、用了哪些参数、出了什么结果,全部可以留存在 shell 历史或脚本文件里。
- 可重复:一条命令跑通了,下次原样执行即可,不需要回忆"上次到底点了哪个按钮、选了哪个模型"。
- 可交接:把脚本交给你同事,对方不需要学习你的点击路径,只要环境一样,结果就能复现。
我在某次给一个小团队搭共享 AI 工作流时,就是靠一堆 OpenClaw 命令行脚本完成任务的。当时团队里有人习惯用面板,有人只会跟着文档点,我把整套流程封装成run_summary.sh、batch_process.py之后,沟通成本直接降了一个量级——不再有人问"这一步在哪个菜单里"。
1.3 本专栏采用的环境约定
后面所有命令都默认你已经在命令行里装好 OpenClaw 并初始化完成,终端前缀会显示当前会话状态。如果还没装,先跑一遍官方的一键安装脚本,再把可执行文件路径加进 PATH 环境变量。我这里用 Linux 或 macOS 的 bash 演示,Windows PowerShell 使用者把单引号、双引号的习惯反过来基本就能对上。
$ openclaw --version OpenClaw CLI version 0.9.32. 最常用指令的实战解读:session、run、status、logs
2.1 第一条命令:openclaw status,先看环境再看世界
很多人上手第一件事就是跑openclaw run "你好",觉得能回复就算通了。我的建议相反:先记住openclaw status这条命令,任何时候觉得莫名其妙了,先看一眼状态再下结论。
openclaw status的输出通常包含四类信息:当前使用的配置文件路径、模型服务连接状态、当前活跃会话 ID、最近一次任务的状态码。它相当于给你提供了一面"仪表盘",让你在跑正式任务之前先确认引擎是热着的。
$ openclaw status Config : /home/me/.openclaw/config.toml Model endpoint : connected (latency 238ms) Active session : s_abc123 Last exit code : 0你可能会问,为什么status不只是一个简单的 "OK / Not OK"?因为在真实使用中,"能连上"和"能干活"是两码事。有一次我连续跑任务总是超时,看日志没有任何报错,最后就是靠status发现模型端点的延迟已经涨到 4000ms 以上,网络链路出了问题。如果只看"连接成功"这个结果,问题会很难定位。
2.2 核心指令:openclaw run,一次任务一个世界
openclaw run是平时最常用的执行指令,用法很直观:openclaw run "你的指令内容"。它会把指令发给当前配置的模型,等结果返回后直接打印到终端。我用一个实际例子说明:
$ openclaw run "请用三句话概括什么是事务性数据库,要求通俗易懂" 事务性数据库是一种强调"要么全部成功、要么全部失败"的数据库设计思路。 它通过 ACID 特性保证多个操作不会被拆成半成品,避免数据出现中间状态。 通俗理解就是:一笔钱转账要么扣款和入账都完成,要么什么都不发生。这段回复本身没什么特别,但我想让你注意两点。第一,命令行模式下没有流式打字效果,结果是整块返回的,所以大任务会有等待时间,别以为卡住了;第二,指令里的引号是有讲究的——bash 里双引号允许变量替换,单引号才是字面字符串,如果你的指令里含有$、`这类特殊字符,建议用单引号包住整个指令。
run也是你调试技能、模型效果的最短路径。我通常会在写一个复杂提示词前先跑上十几条run,每条只改动一个变量,对比不同措辞、不同参数下的输出差异。这种高频试错的工作模式,只有在命令行下才做得到。
2.3 会话管理:session子命令让你的对话有记忆
run命令默认每次都是"无状态"的,它在执行完任务后就把历史上下文丢掉了。如果你想让模型记住前文,就要用到session子命令。
简单说,session是一个命名的上下文容器。你把一些指令放在同一个 session 里执行,模型就能引用这些历史的对话内容。常用操作有三条:
# 新建会话并立即执行一条指令 $ openclaw session create --name "项目分析" --run "记住,我们讨论的是用户增长项目" # 在指定会话中继续追问 $ openclaw run "刚才说的三个指标,你觉得哪个最关键?" --session "项目分析" # 查看当前所有活跃会话 $ openclaw session list这里最核心的概念是:session 既不是聊天记录文件,也不是模型上下文窗口的简单映射,而是一个"你主动控制的上下文容器"。默认情况下,OpenClaw 会在上下文接近模型上限时自动丢弃最早的对话内容,但你也可以通过参数控制保留策略。后面第五章我会专门讲 session 丢失的问题,那是初期最容易踩的坑。
2.4 日志查看:logs是排错的显微镜
一旦任务报错或者结果莫名其妙,就得看日志。logs子命令的常用形态有这三种:
# 查看最近 50 条日志 $ openclaw logs --tail 50 # 按关键字过滤日志 $ openclaw logs --grep "timeout" # 持续跟踪日志(类似 tail -f) $ openclaw logs --follow日志记录的信息颗粒度比终端输出细得多。终端上你只看到"任务失败",日志里会有具体的重试次数、网络响应码、上下文 token 用量。配合--verbose参数打开调试输出后,能看到每次请求的具体请求头、耗时分布等更底层的数据。我的习惯是:普通使用开默认日志级别,定位问题时先看一眼日志再下结论,这比反复重跑命令高效得多。
3. 全局参数详解:每个参数背后都有一段真实需求
3.1 参数优先级:命令行 > 环境变量 > 配置文件 > 默认值
OpenClaw 参数体系里最重要的不是你背下了多少个参数名,而是你理解它们如何被读取。任何配置项都可以通过四个层级来设定:命令行参数、环境变量、配置文件、内置默认值。优先级从高到低如上。换句话说,你在命令行写了--model fast,那么它一定覆盖配置文件里的model = "standard"。
这个设计我一开始觉得啰嗦,后来才发现它是干活的保障。比如同一台机器上,你可能同时维护个人项目和客户项目,两者模型偏好不同。如果你每次都手动改配置文件,很容易忘记改回来然后拿错配置跑了一晚上。使用环境变量或者命令行参数覆盖,就不会污染全局配置。
3.2 必懂参数:--model、--config、--verbose、--output
下面这几个参数是我认为短期内必懂的,每个我都给了一句"为什么需要它"的说明。
| 参数 | 作用 | 实际使用场景 | 一句话心得 |
|---|---|---|---|
--model | 指定本次任务使用的模型 | 跑摘要用便宜快的模型,跑深度分析换强模型 | 它让"任务难度"和"模型成本"可以动态匹配 |
--config | 指定本次使用的配置文件 | 一套终端环境对接多个项目的不同配置 | 比频繁修改默认配置文件安全得多 |
--verbose或-v | 输出详细调试信息 | 任务异常时想看清请求流程 | 排错时必开,平时别开,否则输出太吵 |
--output | 指定输出形式 | 把结果保存成文件供后续程序读取 | 和--format json搭配可以实现程序对接 |
举例来说,想把某次任务结果保存成 JSON 文件供后续脚本使用,命令是:
$ openclaw run "提取这段文字里的三个核心观点" \ --model fast \ --output ./result.json \ --format json生成的文件大概是这样的结构:
{ "session_id": "s_abc123", "model": "fast", "response": ["观点一...", "观点二...", "观点三..."], "usage": { "input_tokens": 356, "output_tokens": 128 } }--format json这个参数非常实用,它让 OpenClaw 不再只是一个人机对话工具,而是可以嵌入程序处理的"处理单元"。我在做一个关键词抽取的小工具时,就是让模型定期输出 JSON,然后由 Python 脚本统一汇总,整个过程全程无人值守。
3.3 慎用但有用的参数:--dry-run、--timeout、--temperature
这几个参数不是说不能碰,而是在明白后果的情况下再用。
--dry-run是最安全的"排练"模式。它会把你即将执行的完整请求打印出来,但不会真正发送给模型。我写复杂的批处理脚本时必用这条命令,用来检查"将要发出去的指令到底长什么样"——尤其当指令里拼接了变量时,很容易拼出意外内容,dry-run 能让你提前发现。
--timeout是控制超时时间的,默认值往往比较保守。如果你跑一个需要长思考链路的分析任务,默认超时可能不够。我的做法是针对任务类型分别设定:简单摘要给 30 秒,深度分析给 300 秒。
--temperature控制生成随机性,数值越低回答越稳定、越高越有创意。如果你希望模型输出稳定可复现,建议调到 0.2 左右;如果你在做头脑风暴式的创意生成,0.8 以上会更有惊喜。这里有一个常见的误会:有人以为 temperature 越高模型越聪明,其实它只是让输出分布更"散",并不会提升质量。
3.4 环境变量:不显眼,但适合做固化配置
配置文件能解决的问题就别用命令行参数硬扛。OpenClaw 读取环境变量的方式非常直接,比如OPENCLAW_MODEL=fast、OPENCLAW_TIMEOUT=120、OPENCLAW_CONFIG=/path/to/config.toml。适合放环境变量的通常是"这台机器上长期不变的偏好",比如默认模型和默认超时。
我在一台专门用来跑批处理的机器上,会在.bashrc里写好这样几行,省得每次敲命令都带一堆参数:
export OPENCLAW_MODEL=standard export OPENCLAW_TIMEOUT=180 export OPENCLAW_OUTPUT_FORMAT=json注意,环境变量的优先级低于命令行参数但高于配置文件。这意味着你可以在.bashrc里设一个通用偏好,遇到特殊任务再用命令行覆盖。这个"通用兜底+临时覆盖"的组合逻辑,是参数体系中最值得养成的习惯。它跟编程里"默认参数 + 局部重写"的思路一模一样,理解一次,终身受用。
4. 一条真实工作流:从零开始用命令行完成一次批量文档总结
4.1 需求拆解:把"大任务"切成"小命令"
只看单个命令总是不够直观,所以我挑了一个我真实做过的小任务,从头到尾把完整命令串一遍。这个任务是:某目录下有 10 篇产品说明文档,我需要逐个总结成三个要点,并把结果按文件名一一对应地保存下来。
先拆解一下需求。这项任务包含四个子步骤:拿到文件列表、对每个文件调用模型做总结、把结果保存、最后确认所有文件都处理完。用图形界面做,你得反复打开上传、复制、保存;用命令行做,则是一条循环加一个最终检查。
4.2 第一步:确认输入文件,避免"空跑"
我用一个变量把文件列表先接住,先打印个数确认,防止后面循环跑了个寂寞。
$ files=$(ls docs/*.md) $ echo $files | tr ' ' '\n' | wc -l 10这一步看似多余,实则是在为后面的批处理打地基。人有视觉确认能力,知道"这里有 10 个文件",但命令行不会替你数数。万一目录路径写错了,后面循环跑了一通结果全是空输入,浪费时间和 token,排查还麻烦。脚本中先确认输入再循环是我一直坚持的习惯。
4.3 第二步:逐文件跑任务并保存结果
接下来是核心循环。我用了--output参数把每个结果直接写入独立文件,并用文件名做了映射:
$ for f in docs/*.md; do openclaw run "请阅读以下文档并给出三个核心要点:$(cat "$f")" \ --model fast \ --format text \ --output "${f%.md}_summary.txt" done说明一下这里要注意的地方。命令中的$(cat "$f")会把文件内容直接拼接进指令文本,这是一个非常常见但也很容易出问题的写法。如果文件太大,指令会超过模型上下文窗口;如果文件内容里含有特殊字符,可能被 bash 重新解析。更稳妥的方式是用openclaw run --input-file "$f",前提是你用的版本支持这个参数。不支持的话,我建议把大文件先拆成小块再批量提交。
4.4 第三步:检查输出状态,别让错误悄悄溜走
循环结束后,我不会马上宣布"完成",而是先看退出码和输出文件个数。命令行模式下,只要命令没有抛异常,循环就会一路跑完,哪怕里面有任务内容生成失败。所以批处理后的检查环节是必须的。
$ echo "exit=$?" $ ls docs/*_summary.txt | wc -l 10 $ openclaw logs --grep "error" --tail 200这组检查背后的逻辑是"三层验证":退出码判断命令本身是否正常执行,文件数量判断是否每篇都有输出,日志检查有没有隐藏的错误记录了但没弹出来。这三个都没问题,我才会放心地把结果交出去。
4.5 第二步的进阶版:用管道直接喂内容
如果你不想把文件内容拼到指令里,也可以用管道把内容喂给 OpenClaw。这是命令行风格的典型用法,也是我日常工作流里非常喜欢的一种形态:
$ cat docs/产品A.md | openclaw run "请提取这份文档的要点" --model fast管道输入的好处是干净、不容易被转义问题纠缠。缺点是一次只能处理一个文件的内容,batch 能力弱。两个方式没有绝对优劣,小文件快速任务我用管道,需要保存结果、批量处理的场景我用带--input-file的方式。
5. 那些文档不会写,但实际操作一定会遇到的坑
5.1 坑一:session 上下文不是无限大的,它会"悄悄遗忘"
这是我这段时间踩得最疼的一个坑。有一回我在某个 session 里连续讨论了大量背景材料,中间隔了一段时间没继续,再回来追问时发现模型完全不记得之前提到的一个关键假设。我第一反应是"OpenClaw 是不是有 bug",翻日志才发现,session 的上下文窗口是有容量上限的,超出的部分会按策略被裁剪掉。
理解这个机制很重要:session 的"记忆"不等于"永久存储"。它更像是临时工位,东西多了就得腾地方。如果要长期保存某些信息,应该把它们写入外部知识库或文件,而不是寄托在对话上下文里。我的实际做法是:关键背景资料单独写成context.md文件,每次开启重大问题分析时重新加载一下,而不是指望模型从长对话里回忆。
5.2 坑二:Windows PowerShell 下的引号转义会吃掉你的指令
在 Linux/macOS 的 bash 里,单引号、双引号各司其职,规则相对容易理解。但换到 Windows PowerShell 环境,转义规则完全不同——双引号内的$符号照样会被当作变量前缀处理,单引号又不能包住含单引号的内容。我吃过一次亏:在 PowerShell 里跑openclaw run "请解释$HOME变量的含义",结果指令传到模型那里时,$HOME已经被替换成了本机路径,模型看到的是具体路径而不是"$HOME 变量"。
这个问题的解决思路有两层。第一层,在 PowerShell 里写指令尽量把$转义为`$,或者改用单引号包裹整个指令。第二层,更建议把复杂指令写进文件再执行,比如openclaw run --prompt-file ./prompt.txt,从根本上避开 shell 解析。我在 Windows 机器上跑重要任务时,几乎都走文件路径,这比调引号规则要省心得多。
5.3 坑三:日志全开时输出太吵,不开时问题又看不见
--verbose、--debug这类参数确实能提供海量信息,但一开起来终端输出会多到找不到北。我一开始图省事,直接在.bashrc里设了默认调试输出,结果每次命令输出几十行附加信息,真正想看的结果被淹没在日志里。
后来我调整了策略:日常运行用默认日志级别,只有任务失败时才临时加--verbose重跑一遍。这样既能保证正常输出的干净,又能在排错时随时"放大镜"。另外,如果你要定位的是网络层面的问题,logs --grep "latency"比开着--verbose肉眼扫描要高效得多。
5.4 坑四:批处理循环里--output的路径必须干净
写 batch 脚本时,--output ./result.json看起来没问题,但如果循环里文件名变量没处理好,很容易把文件写到意外位置或者相互覆盖。有一次我在脚本里漏掉了文件名变量,导致每次循环都往同一个文件里写,跑完之后那个文件只有最后一次任务的结果,前面几轮全白跑了。
要避免这个问题,一个简单的原则是:输出文件名一定要包含输入文件的唯一标识。比如${f%.md}_summary.txt能保证一一对应。跑完后再用文件计数确认一遍,这个习惯能救回大量无效工作。
6. 参数速查表:把常用的参数一次列全
为了方便随时翻阅,我把前面提到的所有高频参数整理成一张表。建议收藏,尤其是刚开始掌握命令行的时候,把表格放在手边可以少走很多弯路。
| 参数 | 类型 | 默认行为 | 典型用法 |
|---|---|---|---|
--model | 字符串 | 配置文件指定 | 按任务难度切换模型 |
--config | 路径 | 默认配置文件 | 多项目隔离配置 |
--verbose/-v | 开关 | 关闭 | 排错时打开 |
--debug | 开关 | 关闭 | 更详细的调试信息 |
--output | 路径 | 终端打印 | 保存结果到文件 |
--format | 字符串 | text | text / json / markdown |
--input-file | 路径 | 无 | 从文件读取输入内容 |
--prompt-file | 路径 | 无 | 从文件读取提示词 |
--session | 字符串 | 临时会话 | 指定要续接的会话名 |
--dry-run | 开关 | 关闭 | 只显示请求不真正执行 |
--timeout | 整数 | 默认配置 | 控制单次任务最长等待时间 |
--temperature | 浮点数 | 默认配置 | 调整输出随机性 |
这条表不是让你全背下来,按需查才是常态。我的个人习惯是:新参数先拿--dry-run跑一遍,确认请求长什么样,再真正执行。这个习惯让我躲过了很多次误操作。
7. 我的日常命令行习惯:几条可以照抄的经验
7.1 用别名把长命令变短
OpenClaw 的命令虽然清晰,但敲多了也累。我的做法是在.bashrc里设置别名,把高频命令缩短:
alias oc='openclaw' alias oc-run='openclaw run --format text' alias oc-json='openclaw run --format json' alias oc-status='openclaw status' alias oc-log='openclaw logs --tail 80'设好之后,oc-run "..."和oc-json "..."用起来比原生命令顺手很多。特别是oc-json,配合管道就可以非常方便地接入其他工具。
7.2 默认输出格式切换为 JSON 再配 jq
如果不仅是手动跑任务,还想把结果交给脚本处理,我强烈建议把--format json设为默认。JSON 输出的结构化程度远高于纯文本,再配合jq做字段提取,几乎就是一个轻量级的自动化流水线。
$ openclaw run "列出三种常见的分布式事务方案" \ --format json | jq '.response[]'这行命令的效果是把结果里的每一条回答按数组元素打印出来,方便后续做进一步处理。说实话,我第一次在终端里看到自己的 AI 响应能被jq这样拆解时,才真正理解"命令行是给懂自动化的人准备的门票"这句话。
7.3 定期清理 session 列表,保持工作区整洁
session 多了之后,openclaw session list输出会越来越乱。有些 session 只是顺手起的名字,聊完就扔了,堆积起来对后续查找造成干扰。我每周末会集中清理一次,把已经结束任务的会话删除:
# 列出所有会话 $ openclaw session list # 删除不需要的会话 $ openclaw session delete s_abc123这里要提醒的是,删除 session 之前先确认里面没有还没导出结果的内容。session 的上下文如果还没保存,删除后就无法找回。我在早期就误删过一个存了较多上下文分析的会话,那部分讨论材料只能靠记忆重写,非常痛苦。
7.4 给重要任务写一个"任务脚本"
永远不要把复杂的多步骤任务用一行超长命令完成——回车一敲,万一中间逻辑错了,可能造成不可逆的结果。我的做法是为较复杂的任务单独写一个 shell 脚本,脚本里按步骤分成几个函数,每一步先打印提示再执行:
#!/usr/bin/env bash set -euo pipefail FILES=$(ls docs/*.md) echo "[1/3] 文件扫描完成,共 $(echo $FILES | wc -w) 个文件" for f in docs/*.md; do openclaw run "总结要点:$(cat "$f")" --model fast --output "${f%.md}_summary.txt" done echo "[2/3] 批处理执行完成" COUNT=$(ls docs/*_summary.txt | wc -l) echo "[3/3] 已生成 $COUNT 份总结文件"set -euo pipefail这一行很关键,它让脚本在遇到未定义变量或某个命令失败时立刻退出,避免"看起来跑完了其实一堆空结果"的虚假成功。再加上每步的进度提示,就算处理到一半出错,你也能立刻知道问题出在第几步。
8. 实战对话示例:把几个指令放在同一情境里看
这一节我会模拟一个真实使用场景,把前文讲到的命令串在一段连续对话里展示。假设你临时接到一个任务:分析某项目里的三份周报,做出一份问题清单。
# 新建会话,准备上下文 $ openclaw session create --name "周报分析" # 依次导入三份周报 $ openclaw run "这份是第1周的周报:$(cat week1.md)" --session "周报分析" $ openclaw run "这份是第2周的周报:$(cat week2.md)" --session "周报分析" $ openclaw run "这份是第3周的周报:$(cat week3.md)" --session "周报分析" # 基于以上材料做问题汇总 $ openclaw run "请梳理这一季度的主要问题,并标注风险等级,输出JSON" \ --session "周报分析" \ --format json这样做的好处是,模型在汇总时能同时引用三份周报的内容,因为三条指令都在同一个 session 下,上下文是连贯的。如果分别用三个 session 执行,"第三次总结"这步就会缺乏前文的对照信息,分析质量会明显下降。
这个例子也说明了一个观点:session 的用途不只是"聊天续上",它可以作为小型的多步任务上下文容器来使用。把前置材料一步步喂进去,再在最后一步做综合判断,输出结构化结果,这是命令行方式下非常高效的一种任务模式。
最后再分享一个小经验:如果你发现单次 session 里塞的材料太多导致模型"遗忘",不要犹豫,直接把关键材料摘成独立文件存下来,然后在每一步任务里显式引用。上下文再大,也不如你把重要的信息写在配置文件里、写在指令里来得可靠。命令行归根结底是关于"控制"——控制输入、控制输出、控制上下文,控制住了,OpenClaw 才能真正成为你顺手的工作流工具。