有时,在向 exec 函数 (-X) 传递参数时,需要在 shell 中引用字符串或壳调用,这可能有些冗长或不灵活,因为这些参数需要额外用引号引用,因为它们被解析为 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]}]
...)
在 :exec-args: 中向 deps.edn 配置添加一些内容,这将仅改变消费者的行为
其他需要考虑的事项
- 该约定应与 bash、cmd.exe 和 Powershell 都很好地兼容,不应在那些 shell 的语法中有特殊含义。我在这几个 shell 中尝试过 /,这似乎不会干扰。
在实验后我发现 / 可能比 @ 更好,因为 @ 在 PowerShell 中有特殊含义
bb -e "*command-line-args*" /foo @bar
("/foo")
此外,@ 经常意味着:从文件中汲取内容并将其作为参数内联