【发布时间】:2021-03-19 16:05:19
【问题描述】:
原则上,通过在mix.exs 中定义以cmd 开头的aliases,我可以将任何shell 命令作为混合任务运行。但我在空格、引用和反斜杠转义方面苦苦挣扎。以下是一些无效的示例:
defp aliases do
f1: ["cmd echo \"two spaces between\""],
f2: ["cmd echo 'two spaces between'"],
f3: ["cmd echo two\ \ spaces\ \ between"],
f4: ["cmd echo two\\ \\ spaces\\ \\ between"],
end
他们都只是产生字符串"two spaces between",不是我期望或目标的,"two spaces between":
$ for t in f1 f2 f3 f4; do mix $t; done
two spaces between
two spaces between
two spaces between
two spaces between
那么如何将带引号的字符串传递给 shell 命令呢?更一般地说,别名cmd 目标在被shell 运行之前是如何处理的,还是直接执行的?命令字符串中去掉单双引号和反斜杠的逻辑是什么?
更新:更多失败案例:
q1: ["cmd echo \"one two three\""], # "one two three"
q3: ["cmd echo \\\"one two three\\\""], # "one two three"
q5: ["cmd echo \\\\\"one two three\\\\\""], # "one" (!!!)
f5: [
"""
cmd echo 'two spaces between'
"""
],
显然,我希望能够同时传递两种引号以获得预期效果,但似乎有一些未记录在案的情况,并且在这种情况下,操作中的输入字符串过于激进和不必要的卫生处理。
我正在使用 Elixir 1.11.1 运行它。
【问题讨论】:
-
我相信有些引号被壳本身吃掉了。在
[~S|cmd echo \\"two spaces between\\"|]旁边应该做一些事情。 -
在发布原始问题之前,我已经尝试过增加反斜杠的数量,但总是失败。你的相当于
["cmd echo \\\\\"two spaces between\\\\\""],对吧?有了这 5 个随之而来的反斜杠,我只打印了“一个”。更奇怪的是。
标签: elixir elixir-mix