关于erl的启动参数主要分为emulator flagsflags and plain arguments

emulator flags:以‘+’开头的启动参数,如+P, +W等用于控制模拟器的行为。

flags:以'-'开头的启动参数,如-sname, -boot等,这些需要被传递给ert中的init模块进行解析处理。

plain arguments:没有详细的定义,基本就是除了以上emulator flags,和flags,其他的都属于此类。用户自定义的flag, 在init对arguments的解析过程中进行解析和存储。

 

模拟器flag主要控制 emulator的行为或者配置,这部分直接查文档即可得到相应解释。

接下来,我们来查看一下init中关于上面关于flags和plain arguments的解析。

parse_boot_args(Args) ->
    parse_boot_args(Args, [], [], []).

parse_boot_args([B|Bs], Ss, Fs, As) ->
    case check(B) of
    start_extra_arg ->
        {reverse(Ss),reverse(Fs),lists:reverse(As, Bs)}; % BIF
    start_arg ->
        {S,Rest} = get_args(Bs, []),
        parse_boot_args(Rest, [{s, S}|Ss], Fs, As);
    start_arg2 ->
        {S,Rest} = get_args(Bs, []),
        parse_boot_args(Rest, [{run, S}|Ss], Fs, As);
    eval_arg ->
        {Expr,Rest} = get_args(Bs, []),
        parse_boot_args(Rest, [{eval, Expr}|Ss], Fs, As);
    flag ->
        {F,Rest} = get_args(Bs, []),
        Fl = case F of
             []   -> [B];
             FF   -> [B,FF]
         end,
        parse_boot_args(Rest, Ss,  
                [list_to_tuple(Fl)|Fs], As);
    arg ->
        parse_boot_args(Bs, Ss, Fs, [B|As]);
    end_args ->
        parse_boot_args(Bs, Ss, Fs, As)
    end;
parse_boot_args([], Start, Flags, Args) ->
    {reverse(Start),reverse(Flags),reverse(Args)}.

check(<<"-extra">>) -> start_extra_arg;
check(<<"-s">>) -> start_arg;
check(<<"-run">>) -> start_arg2;
check(<<"-eval">>) -> eval_arg;
check(<<"--">>) -> end_args;
check(X) when is_binary(X) ->
case binary_to_list(X) of
[$-|_Rest] -> flag;
_Chars -> arg %Even empty atoms
end;
check(_X) -> arg. %This should never occur

get_args([B|Bs], As) ->
case check(B) of
start_extra_arg -> {reverse(As), [B|Bs]};
start_arg -> {reverse(As), [B|Bs]};
start_arg2 -> {reverse(As), [B|Bs]};
eval_arg -> {reverse(As), [B|Bs]};
end_args -> {reverse(As), Bs};
flag -> {reverse(As), [B|Bs]};
arg ->
get_args(Bs, [B|As])
end;
get_args([], As) -> {reverse(As),[]}.

使用init:get_arguments/0, init:get_argument/1获取flags

使用init:get_plain_arguments/0获取plain arguments。

 

关于plain arguments我们可以有三种方式在启动时输入。

1. 在所有flag的开头

如:erl xx yy -sname xx

plain arguments 为["xx", "yy"].

arguments中sname值为[["xx"]].

 

2.但有的时候我们需要在想在中间或者接着其他flags插入plain arguments时候,这时候我们需要用 --  来分隔

如:erl -sname xx xx 

这样使用init:get_argument(sname)时,

获得sname值为[["xx", xx"]], init:get_plain_arguments() 则为[]

但如果这样erl -sname xx --x

则获得sname值为[["xx"]],

plain arguments为["xx"].

 

3. 最后,我们可以-extra之后输入, 这之后的所有参数全部归为plain arguments中,

如:erl -extra yy -sname xx

plain arguments为["yy", "-sname", "xx"]

 

 

 posted on 2012-12-26 15:43  文武双全大星星  阅读(1067)  评论(0编辑  收藏  举报