私は Windows にまったく詳しくありませんが、きっと、これを見た方がいいでしょ う。これは実装os:cmd/1
関数です。
に問題がありos:cmd/1
ます。この関数は、コマンドの実行が成功したかどうかを通知しないため、(プラットフォームに依存する) 特定のコマンド シェルの動作に依存するだけで済みます。
関数を使用することをお勧めしますerlang:open_port/2
。そんな感じ:
my_exec(Command) ->
Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),
get_data(Port, []).
get_data(Port, Sofar) ->
receive
{Port, {data, Bytes}} ->
get_data(Port, [Sofar|Bytes]);
{Port, eof} ->
Port ! {self(), close},
receive
{Port, closed} ->
true
end,
receive
{'EXIT', Port, _} ->
ok
after 1 -> % force context switch
ok
end,
ExitCode =
receive
{Port, {exit_status, Code}} ->
Code
end,
{ExitCode, lists:flatten(Sofar)}
end.
そのため、関数はプロセス標準出力とともにプロセス終了コードmy_exec/1
を返します。