有时候在 shell 中引用字符串或 shell 调用可以在将参数传递给 exec 函数 (-X) 时显得有点冗长或笨拙,因为这些参数因为被解析为 EDN 而需要额外的引号。
这个例子最近在 Slack 上发布
clojure -X:bench :json "$(my_json_producing_cmd --blah)"
结果几乎不可能将 JSON 作为参数传递。
为这样的参数提供一种绕过 EDN 解析的方法可以缓解这个问题。
一种可能的约定是使用一个在 EDN 中通常无效的起始字符,例如 / 符号
clojure -X:bench :json /"$(my_json_producing_cmd --blah)"
替代方法
在函数上使用元数据以退出处理:这将改变解析行为在实现方面,例如
(defn foo
{:tools.deps/exec-skip-edn-read #{:a}}
[{:keys [a b c]}]
...)
在 deps.edn 配置中的 :exec-args: 中添加一些内容,这将仅更改消费者的行为
需要考虑的额外事项
- 约定应与 bash、cmd.exe 和 Powershell 都有良好的兼容性,并且在这些 shell 的语法中不表示任何特殊含义。我曾尝试过这些 shell 中的 /,这似乎没有干扰。
经过实验,我发现 / 可能比 @ 工作得更好,因为 @ 在 powershell 中有特殊含义
bb -e "*command-line-args*" /foo @bar
("/foo")
此外,@ 常常意味着:从文件中吸入内容并将该内容内联为参数。