10

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

exec erl file.erl

但是,我似乎无法找到如何在这个文件中直接启动一个函数。

例如

exec erl file.erl -f function()

任何建议表示赞赏...

4

2 回答 2

19

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

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

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

-run Mod [Func [Arg1, Arg2, ...]] (init flag) 使 init 调用指定的函数。Func 默认启动。如果没有提供参数,则假定该函数的参数为​​ 0。否则,假定它的参数为 1,将列表 [Arg1,Arg2,...] 作为参数。所有参数都作为字符串传递。请参见初始化 (3)。

-s Mod [Func [Arg1, Arg2, ...]] (init flag) 使 init 调用指定的函数。Func 默认启动。如果没有提供参数,则假定该函数的参数为​​ 0。否则,假定它的参数为 1,将列表 [Arg1,Arg2,...] 作为参数。所有参数都作为原子传递。请参见初始化 (3)。

于 2010-11-27T14:54:41.773 回答
0

erl手册页][1] shows all the command line options, but [init(3)`似乎有示例,有时还有更好的描述。这篇文章也有一些很好的例子。

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

选项 1:erl -runerl -s

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


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


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

在系统初始化期间评估指定的函数调用。 Func默认为start. 如果没有提供参数,则假定该函数的元数为 0。否则,假定它的元数为 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

如上一节所述,必须编译模块才能与-runor一起使用-s,因此要么erlc在之前调用,要么添加-eval到组合中。假设amod.erlerl执行的同一个文件夹中

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

这将下降到 Erlang shell 提示符。如果只需要启动 Erlang 运行时,请参见-noshellerl手册页)。

来自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

于 2019-12-12T18:08:59.413 回答