在学习语言的早期阶段,并通过ElixirSips系列视频进行工作.我继续打击那些被语言变化稍微亵渎的东西.试图围绕这个问题,Google /
Github问题跟踪/拖网捕获是让我无处可借.我有这个非常基本的模块,它应该只运行一个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在标准lib中,并且阅读文档指示的选项是,很好,可选.所以我传递空的args note |>命令|> System.cmd([]),我得到的是erlang::enoent:再次阅读文档一点更仔细,公正.
所以我尝试使用Erlang的:os.cmd / 1,所以注意|>命令|> :os.cmd,我得到(FunctionClauseError)没有函数子句匹配:os.validate / 1.而我现在被困了
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.
erlang调用期望一个char列表而不是一个二进制文件,因此您需要以下内容:
"ls -al" |> String.to_char_list |> :os.cmd