如何使用Hammerspoon CLI并获取命令传入的自定义参数
问题原因
_cli是hs -c直接执行 Lua 代码时,临时执行上下文内的全局变量,不存在于 Hammerspoon 启动时预加载的模块/init.lua 的全局作用域中,你在注册 IPC 端口的代码里自然找不到这个变量。- 你当前注册
ipc.localPort的回调函数没有定义形参,无法接收命令行传入的参数,无返回值默认输出nil。
你看到的
-- Legacy mode enabled --是命令行工具旧兼容模式的提示,不影响功能,添加--no-legacy参数即可关闭该提示。
解决方法
1. 调整回调函数接收参数
通过 ipc.localPort 注册的端口回调,会自动接收命令行中跟在--后的所有参数,同时-c指定的命令内容会作为第一个参数传入回调,你只需要给回调添加形参即可获取参数:
local ipc = require('hs.ipc') -- 先确认命令行工具已安装,避免IPC调用失败 if not ipc.cliInstalled() then ipc.cliInstall() end -- 第一个参数是 -c 传入的命令,后续参数是 -- 后传入的内容 function fooHandler(cmd, ...) local extraArgs = {...} if cmd == 'bar' then print('调用bar命令成功') print('传入的baz参数为:', extraArgs[1]) end -- 加返回值避免输出nil return true end local port = ipc.localPort('foo', fooHandler)
2. 执行调用命令
运行你原来的命令即可正常拿到参数:
hs -m foo -c bar -- baz
预期输出为:
调用bar命令成功 传入的baz参数为: baz
补充:_cli变量的正确使用场景
如果你不需要走IPC端口注册的模式,只是想直接跑单行命令拿参数,可以直接用-c执行代码,此时就能直接读取_cli变量:
hs -c 'print(_cli.args)' -- baz
输出即为你传入的baz参数。
内容的提问来源于stack exchange,提问作者Thom Smith
相关产品推荐
相关产品推荐

