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"
因此,当我需要知道执行完成的时候,我不能依赖该函数.请提出一些通用方法,如何执行命令并获得包括错误代码的结果.
谢谢!
我根本不熟悉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将返回进程退出代码以及进程标准输出.