作者:mobiledu2502905597 | 来源:互联网 | 2023-05-29 10:51
在学习语言的早期阶段,并通过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
.我现在卡住了.
1> Paweł Obrok..:
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
的例子.
erlang调用需要一个char列表而不是二进制文件,因此您需要以下内容:
"ls -al" |> String.to_char_list |> :os.cmd