【发布时间】:2011-05-16 13:57:00
【问题描述】:
我可以通过命令行或 bash 脚本启动 Erlang 文件:
exec erl file.erl
但是,我似乎不知道如何在这个文件中直接启动一个函数。
例如
exec erl file.erl -f function()
任何建议表示赞赏...
【问题讨论】:
标签: bash command-line erlang erlang-shell
我可以通过命令行或 bash 脚本启动 Erlang 文件:
exec erl file.erl
但是,我似乎不知道如何在这个文件中直接启动一个函数。
例如
exec erl file.erl -f function()
任何建议表示赞赏...
【问题讨论】:
标签: bash command-line erlang erlang-shell
erl man page][1] shows all the command line options, but [init(3)` 似乎有示例,有时还有更好的描述。 This post 也有一些很好的例子。
此外,以下选项并不相互排斥。 -run、-s 和 -eval 开关可以混合使用。
erl -run 或 erl -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 变体。
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 阻止系统初始化进程。
【讨论】:
你可能想要的是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)。
【讨论】:
-eval,以防您需要使用字符串或原子列表以外的参数启动该函数。哦,您可能想添加-noshell 以防止交互式shell 打开,并可能在末尾添加-s init stop 以在功能完成后实际退出Erlang。