跳转到主要内容
Beancount 命令行参考

Beancount 命令行参考

查找 bea 命令、选项、报表行为、JSON 输出、退出代码以及常见本地账本错误的修复方法。

使用此参考来查找 bea 命令及其行为。对于你的第一个账本,请遵循命令行快速入门。对于银行文件,请使用导入演练

命令一览

命令用途
bea init [DIRECTORY]创建包含常见账户的账本
bea add TYPE添加一条带日期的指令
bea add transactions --from FILE.json添加一批交易
bea import SOURCE预览导出文件;添加 --apply 进行写入
bea list TYPE列出并筛选指令
bea check验证完整账本
bea format [PATH]对齐文件或递归格式化目录
bea query [BQL]运行查询或打开交互式查询 shell
bea report TYPE生成财务报表
bea ask [QUESTION]使用可选的托管 AI 辅助处理本地账本
bea cloud …登录并管理托管账本
bea upgrade [--check]使用所属包管理器升级,或检查更新

全局选项和路径

全局选项放在命令之前

bea --file ~/my-books/main.bean check
bea --json list transaction --limit 100
选项行为
--file / -f PATH选择根账本;覆盖 BEA_FILE./main.bean
--json结构化输出;同时禁用 CLI 提示
--no-input禁用提示;缺少必要输入时退出代码为 2
--yes / -y确认诸如云删除等操作;不授予 AI 写入权限
--debug包含异常回溯
--version显示已安装版本,无需网络请求
--help / -h显示帮助;子命令上也可用
--show-completion打印 shell 补全
--install-completion安装 shell 补全
--shell NAME选择 bashzshfishpowershellpwsh,而非自动检测 shell

init 创建自己的目录/文件目标,并忽略 BEA_FILE。它接受全局 --file 代替目录参数。format 使用自己的位置参数,默认为当前工作目录。全局 --file 不选择格式化目标。

创建账本

bea init [DIRECTORY] 默认为当前目录。目录创建 main.bean.bean.beancount 路径直接命名新文件。

选项行为
--currency / -c SYMBOL记账货币;非交互模式下必需,交互模式默认 USD
--date YYYY-MM-DD最早的历史/开户日期;否则使用提示或今天
--opening-balance "ACCOUNT NUMBER"为模板资产/负债账户重复使用;金额使用记账货币

模板开设 Assets:CheckingAssets:SavingsAssets:CashLiabilities:CreditCardIncome:SalaryIncome:InterestExpenses:GroceriesExpenses:DiningExpenses:RentExpenses:TransportExpenses:UtilitiesExpenses:FeesEquity:OpeningBalances

期初余额对冲 Equity:OpeningBalances。债务为负数。货币输入会大写化。允许自定义符号;不是三个大写字母的符号会触发拼写错误警告。这不是 ISO 货币注册表检查。

现有文件永远不会被覆盖。新文件使用仅所有者权限,POSIX 上模式为 0600。后续的 add、import 和 format 写操作保留权限并尊重只读目标。

添加交易

bea add transaction -n "Groceries" --payee "Corner Market" \
  -p "Expenses:Groceries 30" -p "Assets:Checking" \
  --flag '!' --tag household --link receipt-42 --meta 'receipt:IMG_42.jpg'
选项行为
--posting / -p POSTING必需;每个过账重复使用
--date YYYY-MM-DD默认为今天
--flag CHARACTER默认为 *;使用 ! 标记交易以供审核
--payee TEXT可选的对方
--narration / -n TEXT可选的用途;省略的文本列出为 (no narration)
--tag TAG, --link LINK可重复;可选的前导 #^ 被接受
--meta KEY:VALUE可重复的交易元数据
--into FILE在验证根账本的同时写入包含的文件
--allow-errors明确允许语义验证错误;语法仍必须可解析

一个过账可以省略金额。编号的过账可以在账户有单一允许货币或账本有单一兼容记账货币时省略货币。否则,提供符号。

原生过账语法支持算术如 84/2 EUR、成本如 {100 USD}、总成本 {{1000 USD}} 以及价格 @@@。使用十进制金额如 1000,而非指数记法如 1e3

货币兑换需要其实际交易汇率。例如,将 100 EUR @ 1.08 USD 过账到以 EUR 开设的账户,将 -108 USD 过账到支票账户。投资买入可以将 2 AAPL {100 USD} 过账到以 AAPL 开设的账户,将 -200 USD 过账到支票账户。当报表需要市场估值时,添加带日期的 price 报价。

元数据接受裸字符串如 --meta 'receipt:IMG_42.jpg'。原生数字、布尔值、日期和金额保留其类型。示例包括 --meta 'reviewed:TRUE'--meta 'received:2026-08-03'--meta 'fee:2.50 USD'。内部引号强制为字符串:--meta 'code:"1234"'。键必须不同;filenamelineno 被保留。

单次添加、批量添加和导入会将收款人、叙述和字符串元数据中的换行符替换为空格。引号和反斜杠保留其内容。

添加其他指令

所有这些命令需要 --date YYYY-MM-DD。它们也接受 --into FILE--allow-errors

类型必需字段额外选项
open--account / -a重复 --currency / -c 以限制货币
close--account / -a
balance--account / -a, --amount "NUMBER CURRENCY"--pad-from ACCOUNT, --pad-date YYYY-MM-DD
pad--account / -a, --source / -s
note--account / -a, --comment / --message / -m
event--type / -t, --description / -d
price--currency / --commodity / -c, --amount "NUMBER CURRENCY"货币命名被定价的商品
commodity--currency / --commodity / -c
document--account / -a, --filename / --path重复的 --tag--link
custom--type / -t重复的 --value / -v KIND:VALUE

账户名称具有大写根和冒号分隔的段。每个子账户以大写字母或数字开头。Beancount 支持 Unicode 字母和配置的根名称。

余额检查在其日期开始时检查账户。支持容差语法,如 --amount "1538 ~ 1 EUR"。容差必须为非负数。

使用 add balance --pad-from Equity:OpeningBalances 一起写入垫付及其余额断言。垫付默认为前一天;--pad-date 可以选择另一个更早的日期。两个账户都必须处于活动状态。独立的垫付需要稍后的余额来消费它。--allow-errors 可以暂存该中间状态,但无法绕过无效的垫付账户。

add price 跳过根及其包含文件中完全相同的日期/商品/价格重复项。它退出代码为 0,并标识现有位置。不同日期或价格是新添加项。

文档路径相对于包含指令的文件解析。使用 --into years/2026.bean 时,--filename receipt.pdf 表示 years/receipt.pdf,而非你的 shell 工作目录旁的文件。

自定义值类型为 textnumberamountaccountbooldate。例如,预算可以使用 --value "text:travel" --value "amount:500 USD"

批量 JSON 输入

bea add transactions --from transactions.json 接受 JSON 数组:

[
  {
    "date": "2026-08-04",
    "narration": "Groceries",
    "postings": [
      { "account": "Expenses:Groceries", "amount": "45.00 USD" },
      { "account": "Assets:Checking" }
    ],
    "meta": { "receipt": "R-43", "reviewed": true }
  }
]

每笔交易需要 datepostings。可选字段为 flagpayeenarrationtagslinksmeta

过账使用 amountunits,如 {"number":"45.00","currency":"USD"}。两者都省略用于平衡过账。过账字段还包括 costpriceflagmeta。成本包含 numbercurrency,可选 datelabel。价格包含 numbercurrency

使用字符串表示十进制数。元数据使用普通字符串和布尔值,或标记值如 {"kind":"number","value":"1.125"}{"kind":"date","value":"2026-08-04"}{"kind":"amount","number":"2.50","currency":"USD"}。可选的交易 source 位置永远不会作为元数据写入。

默认为原子批次:任何被拒绝的行使账本保持不变并退出代码 1。--partial 写入有效子集,如果任何行被拒绝仍退出代码 1。JSON 错误在 error.result 中描述结果;那里的行索引从零开始。人类行号从一开始。

批量添加接受 --into--allow-errors。它不会去重。使用 bea import 进行银行导出审核。

拆分账本和写安全

保持 --file 指向根。添加 --into 选择现有的包含文件:

bea --file ~/my-books/main.bean add transaction --into 2026.bean \
  --date 2026-08-02 -n "Groceries" \
  -p "Expenses:Groceries 30" -p "Assets:Checking"

目标相对于根目录。它必须已被包含;命名无关文件会被拒绝。添加命令、导入和交互式 AI 写入支持此分离。

写入验证完整的候选账本,包括插件和成本批次记账。根或其包含图的并发更改退出代码 4。只读目标退出代码 3。成功的添加使用与 bea format 相同的对齐,这可能会重新对齐该目标中的现有列。

列出指令

bea list TYPE 支持十一种类型:transactionopenclosebalancepadnoteeventpricecommoditydocumentcustom

选项适用于行为
--limit / -l N所有类型正限制;默认 50
--from-date, --to-date所有类型包含的 YYYY-MM-DD 边界
--allow-errors所有类型尽管加载器错误仍允许部分数据
--account / -a TEXT交易、开放、关闭、余额、垫付、笔记、文档不区分大小写的账户子字符串
--currency / -c SYMBOL价格、商品不区分大小写的精确符号;价格筛选其基础商品
--sort newest/oldest交易默认最新;在限制前应用
--flag CHARACTER交易在限制前筛选如 ! 的条目
--details交易渲染 Beancount 语法、每个过账、元数据和源位置

其他指令类型保持时间顺序。按账户筛选的交易表将其金额列标记为 MATCHING POSTING AMOUNTS。详情和 JSON 仍包含每笔选中交易的所有过账。详情渲染加载的条目,包括推断的金额;它们不是原始源摘录。

检查、格式化和查询

bea check 验证根及其包含。它退出代码 1 表示账本错误,没有 --allow-errors 选项。查询、列表和报表也拒绝加载器错误,除非你明确传递其 --allow-errors 选项。

格式化接受 .bean/.beancount 文件或目录。目录被递归搜索。

格式化模式写入?退出行为
bea format PATH成功时为 0
bea format PATH --dry-run即使文件会更改也为 0
bea format PATH --check需要格式化时为 1;干净时为 0

每种模式按文件和行报告语法错误,跳过这些文件,并退出代码 1。递归正常运行仍可格式化有效文件。JSON 在失败时报告 scannedformattedskippeddry_runcheck,在 error.result 下。

bea query "BQL" 运行 Beancount 查询。省略 BQL 打开交互式 shell;exitquit 关闭它。非交互模式下查询参数必需。BQL 的默认表每行一个过账。查询表保留精度。空结果在 stderr 上打印 (no rows);JSON 返回空 data.rowsdata.columns 中的列元数据。

财务报表

报表输出
bea report overview资产、负债、收入、费用、净资产和区间序列
bea report income-statement收入/费用树、净利润和期间行
bea report balance-sheet资产/负债/权益树和派生对账
bea report trial-balance账户余额

所有报表接受 --conversion / -x--time / -t--account / -a--allow-errors。除试算平衡外,所有还接受 --interval / -i:默认为 monthly,或 quarterlyyearlyweeklydaily

时间筛选包括年、月、日、季度、周或范围,如 20262026-082026-08-312026-Q32026-W32"2026-01 - 2026-08"。相对期间包括 yearquartermonthweekday 和偏移如 month-1。账户筛选保留匹配交易的每个过账。

转换默认为账本的单一记账货币。否则,默认为 units,保持商品分离。at_cost 使用购置成本。at_value 使用市场价值,成本回退。

显式货币转换需要在每个估值日期(包括区间日期)上或之前有价格。缺失价格错误命名实际缺口,如 No EUR → USD price on or before 2026-01-31。较晚的报价无法填补较早的缺口。添加历史上适当的价格,使用 --conversion units,或选择 --allow-errors 检查部分值。

部分报表保留源货币,并标记组合总数不可用。JSON 包括 valuation: "partial"missing_pricesmissing_price_dates。受影响的净利润/净资产总数在请求的货币中为 null

收入、负债和权益通常使用 Beancount 负数符号。净利润为 -(income + expenses),收益为正。相同约定适用于损益表期间行。资产负债表对账为报表派生;它不写入指令。equity_reconciled 标识是否提供完整对账。

报表 JSON 还标识期间、独占结束日期、截止日期、转换、账户筛选和账本验证状态。在比较总数前检查这些字段。

可选 AI 辅助

bea ask 需要 ask 额外项和来自 bea cloud loginBEA_TOKEN 的 Beancount.io 凭据。默认 Homebrew 安装省略 AI 依赖。Homebrew 用户可以运行:

bea cloud login
uvx --from 'beancount-io[ask]' bea ask "What did I spend last month?" --print

对于 uv 安装,安装 beancount-io[ask] 并直接运行 bea ask--print / -p 回答一次并退出。否则,终端会话是交互式的,可选问题预填其输入。非交互使用需要问题。不支持 JSON 模式。

查询在本地运行。问题、技能上下文和工具结果发送到托管的 Beancount.io AI 服务。交互式写入被预览、确认、验证并原子写入。它们接受 --into。全局 --yes 不授予 AI 写入权限。单答案模式不应用建议的写入。

Ask 从工作目录的 .agents/skills/ 和用户配置目录的 skills/ 中读取 NAME/SKILL.md。项目定义按名称胜出。每个文件需要 YAML namedescription 字段。完整指令按需加载。

托管账本

命令选项和行为
bea cloud login交互式浏览器/设备登录
bea cloud logout尝试远程注销并清除存储的凭据
bea cloud status账户、凭据来源和过期时间
bea cloud ledger list--page 默认为 1;--limit 默认为 50,API 最大 100
bea cloud ledger show OWNER/NAME检查托管账本
bea cloud ledger create NAME--description / -d--private / --public;默认为私有
bea cloud ledger clone OWNER/NAMESSH 克隆;可选 --dir PATH
bea cloud ledger delete OWNER/NAME永久删除;需要确认或全局 --yes

创建还接受 --clone--dir。克隆需要 Git 和 SSH 访问。创建后克隆失败,托管账本仍然存在。本地命令不会自动上传你的账本。没有全局 --ledger 选项。

JSON 和退出代码

全局 --json 将成功结果放在 stdout 上:

{
  "bea": "0.1.0",
  "target": { "file": "/home/alice/my-books/main.bean" },
  "data": [],
  "truncated": false,
  "limit": 50
}

bea 是已安装版本;data 取决于命令。目标标识文件、目录、服务器或无目标。包含的写入还标识 into。十进制金额和日期使用字符串。受限列表包括 limittruncated

失败在 stderr 上写入 {"error":{"category":"validation","message":"…","exit_code":1}}。错误还可以包括 detailsresult、后端 request_id 和带 --debugtraceback

代码类别含义
0成功,包括预览和有意重复跳过
1validation账本/模式错误、格式化检查失败或其他运行时失败
2usage无效参数、缺少目标/输入或缺少可选依赖项
3auth身份验证或权限失败
4conflict并发编辑、需要导入审核、现有初始化目标或不确定的远程写入结果

在重试变更前检查 error.result。部分批次可以写入接受的行,递归格式化可以更改有效文件,创建并克隆可以在退出非零前创建托管账本。

CLI 提示被 --no-input、JSON 模式、非终端 stdin 或真实值 CI 禁用。云删除仍需要明确的 --yes。需要审核匹配项时,导入需要明确的重复决策。

输出异常:Ask 拒绝 JSON;云登录需要交互;成功的云注销和克隆不返回 JSON 成功对象。帮助、版本和补全保留文本输出。upgrade 可以将其包管理器的输出流式传输到 stderr,包括在 JSON 模式下。

设置、更新和存储状态

环境变量用途
BEA_FILE--file 后的默认根账本
BEA_CONFIG_DIR覆盖用户配置目录
XDG_CONFIG_HOME否则使用 $XDG_CONFIG_HOME/bea,回退到 ~/.config/bea
XDG_CACHE_HOME缓存目录基础;否则 ~/.cache/bea
BEA_TOKEN托管凭据覆盖;优先于存储的凭据且不保存
BEA_API_URLAPI 基础;默认为 https://api.v3.beancount.io
BEA_DASHBOARD_URL浏览器登录基础;默认为 https://beancount.io
BEA_NO_UPDATE_NOTIFIER真实值时禁用被动更新通知
CI真实值时禁用 CLI 提示和被动更新通知

真实值是 1trueyeson,忽略大小写和周围空白。配置状态包括凭据、Ask 提示历史、用户技能、记住的导入器路径和更新检查缓存。写锁位于缓存目录的 locks/ 下,在你的账本目录之外。

bea upgrade --check 报告版本和安装方法而不升级。bea upgrade 调用 brew upgrade beauv tool upgrade beancount-iopipx upgrade beancount-io。可编辑安装收到手动更新指导。被动检查在交互式已安装副本中每天最多运行一次;显式 upgrade --check 在被动通知器被禁用时仍运行。

使用匹配的管理器卸载:brew uninstall beauv tool uninstall beancount-iopipx uninstall beancount-io。你的账本文件和用户配置保留。

常见修复

症状下一步
未找到账本选择 --file PATH、进入账本目录,或使用 bea init 创建新账本
全局标志说“没有这样的选项”将其移到命令前,如 bea --file main.bean check
账户未知使用 bea add open --date YYYY-MM-DD --account ACCOUNT 开启它
账户不活动阅读引用的开户/关闭日期;纠正交易日期或账户历史
垫付未使用完成其后的余额断言;使用 add balance --pad-from 获得原子对
货币转换不完整添加覆盖错误中命名日期的价格,或检查 units
找不到文档相对于指令文件解析其路径,包括 --into 目标
账本在写入期间更改检查新内容,然后从新预览重试
Shell 检测失败指定 shell,如 bea --shell zsh --show-completion

使用 bea COMMAND --help 检查你安装的版本。源仓库参考包含额外示例和精确指令模型定义。