2014-12-29 3 views
15

언어 학습 초기 단계에서 ElixirSips 비디오 시리즈 작업. 나는 언어 변화에 의해 약간 obseleted 인 재료를 치는 것을 계속한다. 이것과 Google/Github 이슈 트래커/SO 트롤 어딘가에서 내 머리를 감싸려고 노력하는 것은 아무데도 유용하지 않습니다. 난 그냥 쉘 명령을 실행해야이 매우 기본적인 모듈이 있습니다 그러나Elixir에서 기본 셸 명령 실행

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 |> command |> System.cmd([])을 전달하고, 내가 돌아 오는 것은 erlang: :enoent입니다 : 다시 조금 더 신중하고 공정한 문서를 읽은 후에 다시.

그래서 얼랭의 :os.cmd/1을 사용하려고합니다. 따라서 note |> command |> :os.cmd, 나는 (FunctionClauseError) no function clause matching in :os.validate/1이됩니다. 그리고 나는 지금 붙어있다.

+2

내가 비약의 최신 버전에 해당 자습서를 작동하게하는 또 다른 함수를 작성 : 데프 실행'(full_cmd를) do [cmd | args] = String.split (full_cmd, "") System.cmd (cmd, args) end' – ghayes

답변

29

System.cmd/3은 명령의 인수를 목록으로 받아들이는 것처럼 보이며 명령 이름에서 인수를 몰래 시도 할 때 만족스럽지 않습니다. 예를 들어 System.cmd("ls", ["-al"])이 작동하고 System.cmd("ls -al", [])은 작동하지 않습니다. 어떤 사실 것은 아래 일이다

System.cmd("play", ["-qn", "synth", "2", "pluck", note]) 

System.cmd/3 전화 ls 같은 뭔가 잘 작동하지만, 예를 들어 ls -al에 대해 false를 반환 첫 번째 인자와 :os.find_executable/1 : 그래서 귀하의 경우에 당신은 아마 뭔가를해야합니다.

얼랭 전화 대신 바이너리의 문자 목록을 기대하고, 그래서 당신은 다음과 같은 것이 필요합니다

"ls -al" |> String.to_char_list |> :os.cmd 
+1

아, 그건 완전히 이해가됩니다. 어쨌든 옵션으로 구축하기를 원할 것입니다. 그래서 저를 해치는 첫 번째 기본 단계였습니다. 나는하려고했던 방식으로 그것을 파이프 할 수 없다. BTW, Erlang 호출이 작동하지 않는 이유는 무엇입니까 (: os.cmd)? – DanCouper

+1

답변에 추가됨 –

+1

고맙습니다. – DanCouper