【问题标题】:How to run a custom function when starting an Erlang shell / node? (That is, a function within an `.erl` file)启动 Erlang shell / 节点时如何运行自定义函数? (即 `.erl` 文件中的函数)
【发布时间】:2011-05-16 13:57:00
【问题描述】:

我可以通过命令行或 bash 脚本启动 Erlang 文件:

exec erl file.erl

但是,我似乎不知道如何在这个文件中直接启动一个函数。

例如

exec erl file.erl -f function()

任何建议表示赞赏...

【问题讨论】:

    标签: bash command-line erlang erlang-shell


    【解决方案1】:

    erl man page][1] shows all the command line options, but [init(3)` 似乎有示例,有时还有更好的描述。 This post 也有一些很好的例子。

    此外,以下选项并不相互排斥。 -run-s-eval 开关可以混合使用。

    选项 1:erl -runerl -s

    erl man page 描述了 -s-run 开关( 文本相同),但示例在init(3) 中(参见下面的块引用)。


    警告
    被调用的模块必须已经编译,否则 Erlang 运行时将在初始化时崩溃,产生一个神秘的错误消息(这表明函数未定义)。


    -run Mod [Func [Arg1, Arg2, ...]]
    

    在系统初始化期间评估指定的函数调用。 Func 默认为 start。如果没有提供参数,则函数 被假定为 arity 0。否则它被假定为 arity 1, 将列表 [Arg1,Arg2,...] 作为参数。所有论据都是 作为字符串传递。如果引发异常,Erlang 会以 错误信息。

    例子:

    % erl -run foo -run foo bar -run foo bar baz 1 2
    

    这将启动 Erlang 运行时系统并评估以下内容 功能:

    foo:start()
    foo:bar()
    foo:bar(["baz", "1", "2"]).
    

    函数在初始化过程中顺序执行, 然后正常终止并将控制权交给用户。这 表示不会进一步返回块的 -run 调用 加工;为避免这种情况,请在这种情况下使用一些 spawn 变体。

    选项 2:erl -eval

    如上一节所述,该模块必须编译为与-run-s 一起使用,因此要么在之前调用erlc,要么将-eval 添加到组合中。假设amod.erl 位于执行erl 的同一文件夹中

    $ erl -eval 'compile:file(amod)' -run amod
    

    这将进入 Erlang shell 提示符。如果只需要启动 Erlang 运行时,请参阅 -noshell (erl man page)。

    来自init(3)

    -eval Expr
    

    在期间扫描、解析和评估任意表达式Expr 系统初始化。如果这些步骤中的任何一个失败(语法错误,解析 错误或评估期间的异常),Erlang 因错误而停止 信息。在以下示例中,Erlang 用作十六进制 计算器:

    % erl -noshell -eval 'R = 16#1F+16#A0, io:format("~.16B~n", [R])' \\
    -s erlang halt
    BF
    

    如果指定了多个-eval 表达式,则对它们进行求值 按指定的顺序依次排列。 -eval 表达式被评估 依次使用 -s-run 函数调用(这也在 指定的顺序)。与-s-run 一样,评估不会 terminate 阻止系统初始化进程。

    【讨论】:

      【解决方案2】:

      你可能想要的是erl -s module_name function_name

      请注意,您永远不会像在示例中那样在 erl 命令中指定 erlang 文件。 Erlang VM 加载代码路径中的所有模块。这包括本地目录。

      来自http://www.erlang.org/doc/man/erl.html

      -运行 Mod [Func [Arg1, Arg2, ...]] (init 标志)使 init 调用指定的 功能。 Func 默认启动。如果 没有提供任何论据, 假设函数的元数为 0。 否则,它被认为是 arity 1,取列表 [Arg1,Arg2,...] 作为 争论。所有参数都传递为 字符串。参见初始化(3)。

      -s Mod [Func [Arg1, Arg2, ...]] (init 标志)使 init 调用指定的 功能。 Func 默认启动。如果 没有提供任何论据, 假设函数的元数为 0。 否则,它被认为是 arity 1,取列表 [Arg1,Arg2,...] 作为 争论。所有参数都传递为 原子。参见初始化(3)。

      【讨论】:

      • 谢谢乔恩!和往常一样,你挺过来了:)
      • 还有。如果您正在制作命令行工具,请查看 escript。这是一个非常不错的工具,可以放在战争宝箱中。 erlang.org/doc/man/escript.html
      • 还有-eval,以防您需要使用字符串或原子列表以外的参数启动该函数。哦,您可能想添加-noshell 以防止交互式shell 打开,并可能在末尾添加-s init stop 以在功能完成后实际退出Erlang。
      • jon 和 ndim...感谢其他提示。绝对有用,并且符合我正在尝试做的事情。
      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多