2015-08-07 17 views
9

Sto lavorando ad un Erlang. Come posso passare i parametri della riga di comando ad esso?Come posso passare gli argomenti della riga di comando ad un programma Erlang?

programma File-

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

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

Comando di compilazione:

erlc Program.erl 

Esecuzione Comando

erl -noshell -s program main -s init stop 

ho bisogno di passare gli argomenti attraverso comando di esecuzione e vogliono accedere al loro interno principale scritto nel programma principale.

risposta

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

è documentato in erl man page.

Si consiglia di utilizzare escript per questo scopo perché ha una chiamata più semplice.

+0

Grazie Hynek ... fantastico –

+0

Curiosamente, ho [foo, bar] non ["foo", "bar"] – quantumpotato

+0

@quantumpotato: Note '-run'. Secondo la manpage di 'erl', tutti gli argomenti sono passati come stringhe. Quale versione stai usando? Anche allora sarebbe un bug perché questo non dovrebbe cambiare la versione in versione. Romperebbe gli script esistenti. –

2

Questi non sono in realtà parametri della riga di comando, ma se si desidera utilizzare le variabili di ambiente, il modulo os potrebbe essere di aiuto. os:getenv() ti fornisce un elenco di tutte le variabili di ambiente. os:getenv(Var) fornisce il valore della variabile come stringa o restituisce false se Var non è una variabile di ambiente.

Queste variabili env devono essere impostate prima di avviare l'applicazione.

usare sempre linguaggio così da iniziare (su un bash-shell):

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

se si vuole "dal nome" argomento, con i valori di default, è possibile utilizzare questa riga di comando (da un appli giocattolo che ho fatto):

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

lavie: inizio non fa altro che avviare un'applicazione erlang :

-module (lavie). 

-export ([start/0]). 

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

che a sua volta avviare l'applicazione in cui ho definito il valore di default per i parametri, ecco l'app.src (tondo per cemento armato build):

{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, []} 
]}. 

quindi, nel codice dell'applicazione, è possibile utilizzare init: get_argument/1 per ottenere il valore associato a ciascuna opzione se è stata definita nella riga di comando.

-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. 

Definitivamente più complesso di proposta @Hynek, ma ti dà una maggiore flessibilità, e trovo la linea di comando meno opaco.

Problemi correlati