如何在erlang中执行系统命令并获得结果 - 不可靠的os:cmd / 1

时间:2014-11-19 22:45:44

标签: erlang erlang-shell

当我尝试执行以下命令返回错误或不在Windows上退出时 - 我总是得到空列表而不是以字符串形式返回错误,例如:

我明白了:

[] = os:cmd("blah").

而不是

"command not found" = os:cmd("blah").

在linux中 - 一切都按预期工作,所以我得到“/ bin / sh:line 1:blah:command not found \ n”

因此,当我需要知道执行完成的时候,我不能依赖那个函数。 请提供一些如何执行命令和获取结果(包括错误代码)的一般方法。

谢谢!

1 个答案:

答案 0 :(得分:6)

我根本不熟悉Windows,但我确定,你应该看this。这是实现os:cmd/1函数。

os:cmd/1存在问题。这个函数不会让你知道,命令执行是否成功,所以你只需要依赖某些命令shell行为(这取决于平台)。

我建议您使用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将返回进程退出代码以及进程标准输出。