Как передать аргументы командной строки программе Erlang?

Я работаю над Эрлангом. Как передать ему параметры командной строки?

Файл-

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

main() ->
    io:fwrite("Hello, world!n").

Команды Компиляции:

erlc Program.erl

Выполнение Команды-

erl -noshell -s program main -s init stop

мне нужно передать аргументы через выполнение команд и хотите получить доступ к ним внутри главная написано в программе main.

3 ответов


$ 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"]

это задокументировано в erl man page.

Я бы рекомендовал использовать escript для этой цели, потому что он имеет более простой вызов.


если вы хотите "именованный" аргумент с возможными значениями по умолчанию, вы можете использовать эту командную строку (из игрушечного приложения, которое я сделал):

erl -pa "./ebin" -s lavie -noshell -detach -width 100 -height 80 -zoom 6

lavie: start не делает ничего, кроме запуска приложения erlang:

-module (lavie).

-export ([start/0]).

start() -> application:start(lavie).

который, в свою очередь, запускает приложение, где я определил значение по умолчанию для параметров, вот приложение.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, []}
 ]}.

затем в коде приложения вы можете использовать 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.

определенно сложнее, чем предложение @Hynek, но это дает вам больше гибкости, и я нахожу командную строку менее непрозрачной.


Это не совсем параметры командной строки, но если вы хотите использовать переменные среды,os-модуль может помочь. os:getenv() дает вам список всех переменных окружения. os:getenv(Var) дает вам значение переменной в виде строки или возвращает false, если Var не является переменной окружения.

эти env-переменные должны быть установлены перед запуском приложения.

Я всегда использую идиому, как это, чтобы начать (на bash-shell):

export PORT=8080 && erl -noshell -s program main