在通过执行函数(-X)传递参数到shell时,有时给字符串或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")
此外,@通常表示:从文件中收集内容并将其内联为参数。