【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】bash 工具提示词(持久化)(二)
分析到了真正的持久化分成了两个层级:短时的会话持久化(也就是常驻后台进程,这种方式在用户连续和 AI 交互的这段时间里,让 Shell 进程一直活着,保证 OpenCode 连续命令时,状态是连贯的),以及真正的数据持久化(在底层做状态快照,当 Agent 客户端发现用户长时间没动静,或者准备关闭 Shell 进程时,会把当前 Shell 里的关键状态打包,存到硬盘里,用户下次再唤醒这个 AI 时,客户端先去读取上次存档的快照,然后再重新创建一个 Shell 进程,并自动把之前的环境变量和目录状态恢复回去),所以这里说的 bash 工具持久化,并不是说那个具体的进程永远不会退出,而是进程可以被销毁,但状态永远能被找回,另外,准备开始分析禁止使用 cd ... && command 的原因,下面继续
OpenCode
下面继续分析这里禁止 cd ... && command 的原因

- 规避逻辑陷阱,确保命令执行在正确目录 :在 Linux 系统中,
&&表示前一个命令成功后,才执行后面的命令,如果 AI 写了cd不存在的目录&& npm install,则如果cd失败了,后面的npm install根本就不会执行,而 AI 可能会误以为依赖安装成功了,但实际上在原来的目录里啥都没干,而使用工具自带的workdir参数,是由 OpenCode 的底层框架在调用系统 API(比如subprocess)时切换目录,保证目标目录存并执行命令 - 防止命令注入,提升安全性 :如果允许 AI 自由拼接
cd命令,当目录路径中包含一些特殊字符(比如分号;,管道符|或者换行符)时,很容易引发命令注入的漏洞 ,比如路径如果是my_folder; rm -rf /,直接拼接到 Bash 里执行,会引发灾难,而使用workdir参数,OpenCode 框架会在底层对路径进行严格的转义和处理,从根本上杜绝此类安全隐患 - 强制规范化,方便系统记录与调试 :AI 的底层框架需要精确记录在哪个目录下做了什么事,如果 AI 自己在命令里写
cd,框架很难精确解析出 AI 到底想切到哪个目录,而强制使用workdir参数,相当于让 AI 在提交任务时,明确填写工作目录,这样系统日志会非常清晰,出问题时也更容易排查
OK,下面继续分析,接下来是执行命令前的安全提醒

这里明确要求 AI 在真正运行命令之前,必须先完成两个安全检测,防止 AI 犯低级错误或者产生幻觉
- 目录核实 :如果接下来的命令是要创建新的文件夹或文件,AI 不能直接执行,必须先使用
ls命令去检查一下父级目录是否存在,确认没走错地方,举个例子,如果 AI 想运行
bash
mkdir foo/bar
在 foo 里面新建一个 bar 文件夹,就必须先运行
bash
ls foo
确认 foo 这个文件夹是真实存在的,然后再去创建 bar,否则如果 foo 都不存在,直接创建 bar 就会报错
- 命令执行与规范 :这里强调了两个细节,一个路径规范,一个是结果反馈,其中路径规范强制 AI 要给带空格的路径加上双引号,因为在 Linux/Mac 终端里,如果文件路径中间有空格(比如
My Documents),不加引号,系统就会以为是两个分开的命令,从而报错,比如
正确的做法:mkdir "/Users/name/My Documents"(加引号,系统知道这是一整条路径)
错误的做法:mkdir /Users/name/My Documents(不加引号,会失败)
确保路径格式没问题后,再去真正执行命令,并且要把终端里打印出来的结果(比如报错信息,执行成功的提示等)完整地记录下来
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】bash 工具提示词(专用工具)