在学习语言的早期阶段,并完成ElixirSips系列视频。我一直在打一些被语言变化略微痴迷的东西。试图围绕这一点,谷歌/ Github问题追踪器/ SO拖网让我无处可用。我有这个非常基本的模块,它应该运行一个shell命令:
defmodule QuickieSynth.Sound do
def command(note) do
"play -qn synth 2 pluck #{note}"
end
def play(note) do
note |> command |> System.cmd
end
end
但是,当编译此文件并运行测试时,我得到一个参数错误;足够公平 - System.cmd / 1似乎不再是标准库的一部分。
标准库中的 System.cmd / 3 是,阅读文档表明这些选项是可选的。所以我传递空的args note |> command |> System.cmd([])
,我得到的是erlang: :enoent
:再次仔细阅读文档后,再次公平。
所以我尝试使用Erlang' :os.cmd/1
,note |> command |> :os.cmd
,我得到(FunctionClauseError) no function clause matching in :os.validate/1
。我现在卡住了。
答案 0 :(得分:34)
System.cmd/3
似乎接受命令的参数作为列表,并且当您尝试在命令名中隐藏参数时不高兴。例如,System.cmd("ls", ["-al"])
有效,而System.cmd("ls -al", [])
却没有。因此,在您的情况下,您可能需要以下内容:
System.cmd("play", ["-qn", "synth", "2", "pluck", note])
事实上,System.cmd/3
调用:os.find_executable/1
的第一个参数实际上发生了什么,它适用于ls
之类的内容,但例如对ls -al
返回false。< / p>
erlang调用需要一个char列表而不是二进制文件,因此您需要类似以下内容:
"ls -al" |> String.to_char_list |> :os.cmd