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

use*_*252 3 erlang erlang-shell

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

我明白了:

[] = os:cmd("blah").
Run Code Online (Sandbox Code Playgroud)

而不是像

"command not found" = os:cmd("blah").
Run Code Online (Sandbox Code Playgroud)

在linux中 - 一切都按预期工作,所以我得到"/ bin/sh:第1行:blah:命令未找到\n"

因此,当我需要知道执行完成的时候,我不能依赖该函数.请提出一些通用方法,如何执行命令并获得包括错误代码的结果.

谢谢!

Via*_*lev 6

我根本不熟悉Windows,但我敢肯定,你应该看看 这个.这是实现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.
Run Code Online (Sandbox Code Playgroud)

因此函数my_exec/1将返回进程退出代码以及进程标准输出.