Operating system 如何在erlang中连续显示os命令输出?

Operating system 如何在erlang中连续显示os命令输出?,operating-system,erlang,Operating System,Erlang,我需要在erlang中从os命令连续显示stdout/stderr。 在ruby中,我可以使用以下代码实现它: s1, s2 , s3, t = Open3.popen3('for %a in (1 2 3 4 5 6 7 8 9) do (echo message & sleep 2 ) 2>&1 ') s2.each do |l| puts l end 它将以“实时”显示“消息\n消息\n”-不等待进程结束 我试过os:cmd(..) 及 输出: 10>

我需要在erlang中从os命令连续显示stdout/stderr。 在ruby中,我可以使用以下代码实现它:

s1, s2 , s3, t = Open3.popen3('for %a in (1 2 3 4 5 6 7 8 9) do (echo message & sleep 2 ) 2>&1 ')

s2.each do |l|
    puts l
end
它将以“实时”显示“消息\n消息\n”-不等待进程结束

我试过
os:cmd(..)

输出:

10> c(test).
{ok,test}
11> test:run().
Data {data,{eol,"1"}}
Data {data,{eol,"2"}}
Data {data,{eol,"3"}}
Data {data,{eol,"4"}}
Data {data,{eol,"5"}}
Data {data,{eol,"6"}}
Data {data,{eol,"7"}}
Data {data,{eol,"8"}}
Data {data,{eol,"9"}}
Data {data,{eol,"10"}}
Data {exit_status,0}

如果我理解正确,您希望继续与os命令并行执行您的程序。在Erlang中,您可以生成一个这样做的进程,然后继续。比如说

1> spawn(fun() ->  
       P5 = erlang:open_port({spawn, "ruby rtest.rb"}, 
                             [stderr_to_stdout, in, exit_status, 
                              binary,stream, {line, 255}]), 
       receive {P5, Data} -> 
           io:format("Data ~p~n",[Data]) 
       end  
   end).
<0.32.0>
2> 5+5.
10
3>
1>繁殖(乐趣()->
P5=erlang:open_端口({spawn,“ruby rtest.rb”},
[stderr\u to\u stdout,in,exit\u状态,
二进制,流,{line,255}]),
接收{P5,数据}->
io:格式(“数据~p~n”,[Data])
结束
(完)。
2> 5+5.
10
3>

最好写一个模块,这样你就能更好地理解它。

这不是我需要的。我需要在不等待命令结束的情况下获得命令输出。例如,页面顶部的ruby代码允许在进程将其打印到自己的stderr或stdout的同时打印打开的进程的输出行。繁殖进程在繁殖进程(此处为shell进程)继续打印的同时打印输出。在这里,您正在创建另一个Erlang进程,该进程专门等待来自OS进程的数据并打印它,同时生成Erlang进程继续打印。在windows 7 x64上尝试过。你使用什么操作系统?在centos6.2上试用过-你完全正确,它可以工作!非常感谢。
10> c(test).
{ok,test}
11> test:run().
Data {data,{eol,"1"}}
Data {data,{eol,"2"}}
Data {data,{eol,"3"}}
Data {data,{eol,"4"}}
Data {data,{eol,"5"}}
Data {data,{eol,"6"}}
Data {data,{eol,"7"}}
Data {data,{eol,"8"}}
Data {data,{eol,"9"}}
Data {data,{eol,"10"}}
Data {exit_status,0}
1> spawn(fun() ->  
       P5 = erlang:open_port({spawn, "ruby rtest.rb"}, 
                             [stderr_to_stdout, in, exit_status, 
                              binary,stream, {line, 255}]), 
       receive {P5, Data} -> 
           io:format("Data ~p~n",[Data]) 
       end  
   end).
<0.32.0>
2> 5+5.
10
3>