首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

一次:缓存 CLI 命令

摘要

Run a command once, reuse its output for a while. once executes a command in your current directory, prints its stdout and keeps it in memory in a small per-user background daemon. Repeated calls with...

once the and command tenant its for your directory key
2026-10-10 1 阅读 约8分钟阅读 baquero
分享:
字号:
运行命令一次,并暂时重复使用其输出。一旦在当前目录中执行命令,就会打印其标准输出并将其保存在小型每用户后台守护程序的内存中。使用相同命令、目录和租户密钥的重复调用将从内存中应答,直到条目过期。一旦最后一个条目过期,守护进程就会自行停止。典型用例:从 1Password 读取机密,而无需使用指纹批准每次读取。 # 一次,例如in ~/.zshrc: 此终端会话的租户密钥 export ONCE_TENANT= " ${ONCE_TENANT :- $(uuidgen)} " # 稍后在您的脚本中工作时 / direnv / mise.toml export GITHUB_TOKEN= " $( Once --ttl 8h --no-dir -- op read op://Private/GitHub/token ) " 第一次调用会询问您的指纹,8 小时内的每次调用都会使用相同的租户密钥则不然。在任何目录层次结构中使用 mise 或使用 mise.local.toml 的特定项目: [ env ] ONCE_TENANT = " 5D0F399A-5091-43F1-9C43-7C5A2377D90D " # 特定于此上下文 TOKEN = " {{ exec(command='once --ttl 12h --no-dir -- op read op://Private/something/token') }} " go install github.com/alex0ptr/once@latest # Go 1.27+,除了标准库 macOS 和 Linux 之外没有任何依赖项。这是开始的地方:它列出了每个选项和命令(一旦 help 和 -h 也起作用)。如需更详细的文档,请继续阅读。选项 含义 --ttl 缓存结果的时间,例如30m、1h、24h(必填)。 --until 到期的绝对上限(见下文)。 --tenant 分隔缓存上下文的键(见下文)。默认为 $ONCE_TENANT ;两者之一是必需的。 --refresh 忽略缓存,运行命令并覆盖缓存的值。 --no-dir 将工作目录保留在缓存键之外(见下文)。一旦状态显示守护程序、其条目计数以及何时停止。一旦清除,就会删除所有缓存的值并停止守护进程。 -- 之后的所有内容都直接执行(无 shell)。环境变量、工作目录和终端都是从 shell 继承的。如果您需要管道、glob 或其他 shell 功能,请自行包装它们:once --ttl 1h -- sh -c ' op item get "AWS" --format json | jq -r .fields[0].value ' 仅缓存 stdout。 stdin 和 stderr 被传递,因此交互式提示继续工作。非零退出的命令结果永远不会被缓存,并且退出代码会被传递。使用 --no-dir 进行与目录无关的缓存 默认情况下,工作目录是缓存键的一部分,因为相同的命令可以在不同的目录中产生不同的输出( git rev-parse HEAD 、 cat .version 等)。对于输出不依赖于目录的命令(例如 op read ),请传递 --no-dir ,以便一个缓存值服务于每个目录。如果错过,该命令仍会在当前目录中运行。使用和不使用 --no-dir 创建的条目是分开的。使用 --until 限制缓存 --until 需要绝对时间;该条目将在 --ttl 或 --until 中先到者到期。 Once 本身从不计算相对日期;让你的外壳来做这件事。接受的格式: 2026-10-09T06:00:00+02:00 、 2026-10-09T06:00:00+0200 、 2026-10-09T06:00 、 2026-10-09 (没有区域的形式是当地时间)。缓存最多一天,但永远不会超过今天晚上 10 点:once --ttl 24h --until " $( date +%F ) T22:00 " --no-dir -- op read op://Work/DB/password 永远不会过去明天早上: # GNU date (Linux) Once --ttl 24h --until " $( date -d Tomorrow +%F ) T06:00 " -- op read … # BSD date (macOS) Once --ttl 24h --until " $( date -v+1d +%F ) T06:00 " -- op read … 如果 --until 已经是过去的时间,则命令正常运行,并且不缓存其结果。缓存密钥为HMAC-SHA256(租户,工作目录‖命令‖参数)(设置--no-dir时不带目录)。租户密钥是一个命名空间,而不是安全边界,并且不意味着保密;它很可能存在于配置文件中。它做了两件事:它分离缓存上下文(shell、项目、脚本):具有不同租户密钥的上下文获取自己的条目,并且必须自行获取其秘密。它使得缓存键几乎无法被猜测。它不会阻止您自己用户的其他进程使用缓存;请参阅安全模型。上面的 ${ONCE_TENANT:-$(uuidgen)} 模式为每个新终端提供了自己的租户,而从它启动的子 shell 和脚本共享缓存。使用固定值跨终端共享缓存。 (旁注:通过 --tenant 传递的密钥显示在进程列表中。)一旦计算密钥并通过 Unix 套接字询问守护进程。一旦命中,它就会打印缓存的输出并退出。如果失败,它会在您的环境中在您的目录中运行命令本身。如果命令成功,则根据需要启动守护进程,并将输出和到期时间一起交给它。守护进程仅在内存中保存条目。它会跟踪最近的到期时间,并在没有剩余条目时关闭。时间
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱