gpt4 book ai didi

erlang - 有没有 Erlang os :cmd equivalent that takes a list of strings instead of a single command?

转载 作者:行者123 更新时间:2023-12-04 05:59:59 26 4
gpt4 key购买 nike

有没有我可以做的 Erlang 电话 Retval = subprocess:call(["cmd", "arg1", "arg2", "arg3"]) ?

如果我正在构建一个复杂的命令来执行,使用 os:cmd/1 很容易出现转义错误。与 Python 的 subprocess.call() 方法相比,我传入一个字符串列表并知道它是逐字传递给子进程的,没有任何损坏。

谢谢。

最佳答案

这就是我想出的。

-module(mycmd).
-export([cmd/2]).

cmd(Cmd, Args) ->
Tag = make_ref(),
{Pid, Ref} = erlang:spawn_monitor(fun() ->
Rv = cmd_sync(Cmd, Args),
exit({Tag, Rv})
end),
receive
{'DOWN', Ref, process, Pid, {Tag, Data}} -> Data;
{'DOWN', Ref, process, Pid, Reason} -> exit(Reason)
end.

cmd_sync(Cmd, Args) ->
P = open_port({spawn_executable, os:find_executable(Cmd)}, [
binary, use_stdio, stream, eof, {args, Args}]),
cmd_receive(P, []).

cmd_receive(Port, Acc) ->
receive
{Port, {data, Data}} -> cmd_receive(Port, [Data|Acc]);
{Port, eof} -> {ok, lists:reverse(Acc)}
end.

关于erlang - 有没有 Erlang os :cmd equivalent that takes a list of strings instead of a single command?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2231061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com