有时在shell中将字符串或shell调用引起来在传递参数给执行函数(-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")
此外,@通常意味着:从文件中获取内容并将其内联为参数。