关于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"]
posted on
浙公网安备 33010602011771号