linux far命令,Erlang中执行linux命令的两种方法

本文介绍了Erlang中两种执行系统命令的方法:os.cmd(Cmd)和erlang:open_port(PortName,PortSettings)。os.cmd(Cmd)简单易用,适合大多数情况;而erlang:open_port(PortName,PortSettings)虽然复杂但更强大,能够返回更多的执行信息如exitstatus。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

os.cmd(Cmd)

os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令)。返回一个Cmd命令的标准输出字符串结果。例如在linux系统中执行os:cmd("date"). 返回linux的时间。 这种比较简单,一般情况下,也满足了大部分需求。

erlang:open_port(PortName, PortSettings)

当os.cmd(Cmd) 满足不了你的需求的时候,就可以用强大的open_port(PortName, PortSettings) 来解决了。最简单的需求,我要执行一个linux命令,而且还需要返回退出码。os.cmd(Cmd) 就有些捉急了。也不要以为有了open_port(PortName, PortSettings) 就可以完全替代os.com(Cmd) 了。强大是需要代价的。

%% 优点:可以返回exit status 和执行过程

%% 缺点: 非常影响性能, open_port执行的时候,beam.smp会阻塞

当对本身系统的性能要求比较高的时候,不建议使用erlang:open_port(PortName, PortSettings) .

下面是一段很好用的代码,返回exit status 和执行结果。

my_exec(Command) ->

Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),

Result = get_data(Port, []),

Result.

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值