关于erl的启动参数主要分为emulator flags, flags 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"]