如何将命令行参数传递给Erlang程序?

Mon*_*dra 10 erlang

我正在研究Erlang.如何将命令行参数传递给它?

程序文件 -

-module(program).
-export([main/0]).

main() ->
    io:fwrite("Hello, world!\n").
Run Code Online (Sandbox Code Playgroud)

编译命令:

erlc Program.erl
Run Code Online (Sandbox Code Playgroud)

执行指挥 -

erl -noshell -s program main -s init stop
Run Code Online (Sandbox Code Playgroud)

我需要通过执行命令传递参数,并希望在程序主要编写的main中访问它们.

Hyn*_*dil 16

$ cat program.erl
-module(program).
-export([main/1]).

main(Args) ->
    io:format("Args: ~p\n", [Args]).
$ erlc program.erl 
$ erl -noshell -s program main foo bar -s init stop
Args: [foo,bar]
$ erl -noshell -run program main foo bar -s init stop
Args: ["foo","bar"]
Run Code Online (Sandbox Code Playgroud)

它在erl手册页中有记录.

我建议使用escript它,因为它有一个更简单的调用.


Mat*_*nde 5

这些并不是真正的命令行参数,但如果您想使用环境变量,os-module 可能会有所帮助。os:getenv()为您提供所有环境变量的列表。os:getenv(Var)以字符串形式提供变量的值,如果Var不是环境变量,则返回 false 。

这些环境变量应该在您启动应用程序之前设置。

我总是使用这样的习语来开始(在 bash-shell 上):

export PORT=8080 && erl -noshell -s program main
Run Code Online (Sandbox Code Playgroud)


Pas*_*cal 5

如果您想要具有可能的默认值的“命名”参数,您可以使用此命令行(来自我制作的玩具应用程序):

erl -pa "./ebin" -s lavie -noshell -detach -width 100 -height 80 -zoom 6
Run Code Online (Sandbox Code Playgroud)

lavie:start 只是启动一个 erlang 应用程序:

-module (lavie).

-export ([start/0]).

start() -> application:start(lavie).
Run Code Online (Sandbox Code Playgroud)

依次启动我为参数定义默认值的应用程序,这里是 app.src(钢筋构建):

{application, lavie,
 [
  {description, "Le jeu de la vie selon Conway"},
  {vsn, "1.3.0"},
  {registered, [lavie_sup,lavie_wx,lavie_fsm,lavie_server,rule_wx]},
  {applications, [
                  kernel,
                  stdlib
                 ]},
  {mod, { lavie_app, [200,50,2]}}, %% with default parameters
  {env, []}
 ]}.
Run Code Online (Sandbox Code Playgroud)

然后,在应用程序代码中,您可以使用 init:get_argument/1 来获取与每个选项关联的值(如果它是在命令行中定义的)。

-module(lavie_app).

-behaviour(application).

%% Application callbacks
-export([start/2, stop/1]).

%% ===================================================================
%% Application callbacks
%% ===================================================================

start(_StartType, [W1,H1,Z1]) ->
    W = get(width,W1), 
    H = get(height,H1),
    Z = get(zoom,Z1),   
    lavie_sup:start_link([W,H,Z]).

stop(_State) ->
    % init:stop().
    ok.

get(Name,Def) ->
    case init:get_argument(Name) of
        {ok,[[L]]} -> list_to_integer(L);
        _ -> Def
    end.
Run Code Online (Sandbox Code Playgroud)

绝对比@Hynek 提议更复杂,但它为您提供了更大的灵活性,而且我发现命令行不那么不透明。