繁体   English   中英

如何在 Erlang 中执行系统命令并使用 os:cmd/1 获取结果?

[英]How to execute system command in Erlang and get results using os:cmd/1?

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

我得到:

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

而不是像

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

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

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

谢谢!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM