这章回答:怎样不用每次手写一长串参数,就重复观察交易 demo 的价格跳过、现金跳过、Host 拒绝、批准、Prefix 和 PLM 源码?
这些脚本只是命令行预设,不增加交易能力。它们最终都调用本地 go run ./cmd/trade-demo,使用已有的 Guest artifact 和内存中的模拟 market;不会连接外部交易系统,也不产生绩效实验。脚本共同使用 set -euo pipefail,遇到未处理错误即停止,参数原样交给 Go 入口。
普通示例入口:run.sh
demos/run.sh · L1–L7 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
cd "$ROOT"
SOURCE=${1:-examples/order.py}
if (( $# > 0 )); then shift; fi
exec go run ./cmd/demo -source "$SOURCE" "$@"
run.sh 先根据脚本位置计算仓库根目录并切换过去,所以从其他当前目录调用时仍能找到 Go module。第一个位置参数是 Python 源文件,缺省为 examples/order.py;取出它后,其余参数传给 cmd/demo。exec 替换 shell 进程,最终退出状态就是 Go 程序的退出状态。
例如:
bash demos/run.sh examples/branch.py -plm -show-transformed
交易公共入口:trade.sh
demos/trade.sh · L1–L7 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
cd "$ROOT"
# Simulated read latency makes the timestamped tool order easier to follow.
# Later arguments can override this preset, e.g. -read-delay 0.
exec go run ./cmd/trade-demo -read-delay 200ms "$@"
trade.sh 做同样的根目录定位,但固定调用 cmd/trade-demo,并预置 -read-delay 200ms。延迟只是让 stderr trace 中的工具边界更容易按时间观察;它不是同步手段,也不改变 market 的决策。
脚本把 "$@" 放在预设参数之后,因此调用者可以追加 -read-delay 0 或其他 Go flag 覆盖前面的默认值。它没有自行设置 -allow-order,授权由各个场景脚本或调用者显式选择。
六个场景脚本
1. 价格跳过
demos/01-price-skip.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" -limit 90 -allow-order "$@"
这个入口把 limit 降到 90,并显式允许模拟订单。默认价格是 100,所以 Python 在价格条件处选择 hold,不会调用 buy。脚本仍保留 "$@",可以追加参数观察其他局面。
2. 现金跳过
demos/02-cash-skip.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" -cash 500 -allow-order "$@"
这里把初始现金改为 500,同时允许订单。默认请求的成本是 1000,因此价格条件通过后会在现金条件处选择 hold,Host 不会看到买入尝试。
3. Host 拒绝
demos/03-host-denied.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" "$@"
这个入口不加 -allow-order,其余使用交易 demo 默认值。Python 会走到 buy,但 market 的 Host 授权门返回错误;trading.py 捕获后报告 blocked。这能直接对照“Python 控制流允许调用”和“Host 最终允许副作用”之间的差别。
4. Host 批准
demos/04-approved.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" -allow-order "$@"
这个入口只增加 -allow-order。默认价格、现金和数量满足条件,所以 Host 通过当前现金复查,提交一笔内存订单并扣除 1000,报告为 bought。所谓 approved 只代表本地 flag,不代表真实账户或外部成交。
5. Prefix 源码片段
demos/05-prefix.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" -mode prefix "$@"
这里选择 -mode prefix。交易 demo 会把完整文件拆成换行片段,通过 channel 交给 Prefix runner;读完 EOF 后才完成最终执行。可以结合 stderr 中的 source.send、source.closed 和工具事件观察“源码接收”和“买入调用”不是同一时刻。
6. PLM 与 transformed source
demos/06-plm-source.sh · L1–L3 · 打开完整源码
#!/usr/bin/env bash
set -euo pipefail
exec bash "$(dirname -- "${BASH_SOURCE[0]}")/trade.sh" -mode plm -show-transformed "$@"
这里选择 -mode plm -show-transformed。stdout 是交易报告,stderr 还会打印实际 Guest AST 改写后的源代码。该入口用于观察 quote、cash 等允许提前读取的调用如何出现在 transformed source 中;不能据此推断 buy 被提前提交。
参数覆盖的读法
每个场景脚本先给出一个局面,再把用户追加的参数交给 trade.sh。因此阅读输出时先看最终 stderr 的 demo.config,确认 mode、price、cash、allow_order 和 read_delay;不要只看脚本文件名推断最终配置。脚本层只组合参数,输入 JSON 的解析、模式选择、Host gate 和报告组装仍在 交易演示 的 Go 代码中。
下一步
先用 01 到 04 对照交易 Python 的四个决策出口,再用 05 和 06 对照 Prefix/PLM 的时序与 transformed source。若要追踪实际工具调用和当前账户状态,回到交易演示的 market 分段。