2015-08-07 3 views
9

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

Программа File-

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

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

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

erlc Program.erl 

Execution Command-

erl -noshell -s program main -s init stop 

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

ответ

12
$ 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, поскольку он имеет более простой вызов.

+0

Thanks Hynek ... awesome –

+0

Любопытно, что я получаю [foo, bar] not ["foo", "bar"] – quantumpotato

+0

@quantumpotato: Примечание '-run'. Согласно man-странице 'erl', все аргументы передаются как строки. Какую версию вы используете? Даже тогда это будет ошибка, потому что это не должно изменять версию до версии. Это нарушит существующие сценарии. –

2

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

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

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

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

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

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

Лави: начало ничего не делает больше, чем запуск приложения Erlang :

-module (lavie). 

-export ([start/0]). 

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

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

, то в коде приложения вы можете использовать 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 предложение, но это дает вам больше гибкости, и я нахожу, что командная строка менее непрозрачным.