Как передать аргументы командной строки программе 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