这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令脚本,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
escript - Erlang 脚本支持
商品描述
抄写 支持运行简短的 Erlang 程序而无需编译它们
首先是检索命令行参数的简单方法。
出口
脚本名称 脚本参数 1 脚本-arg2...
抄写 脚本标志 脚本名称 脚本参数 1 脚本-arg2...
抄写 运行用 Erlang 编写的脚本。
下面是一个例子。
$ chmod u+x 阶乘
$ cat 阶乘
#!/usr/bin/环境 抄写
%% -*- 二郎 -*-
%%! -smp enable -sname factorial -mnesia debug verbose
主要([字符串])->
尝试
N = list_to_integer(字符串),
F = 面(N),
io:format("阶乘 ~w = ~w\n", [N,F])
捕捉
_:_ ->
用法()
结束;
主要(_)->
用法()。
用法()->
io:format("用法:阶乘整数\n"),
停(1)。
FAC(0) -> 1;
fac(N) -> N * fac(N-1)。
$ ./阶乘 5
阶乘 5 = 120
$ ./阶乘
用法:阶乘整数
$ ./阶乘五
用法:阶乘整数
示例中 Erlang 脚本的标头与普通 Erlang 模块不同。
第一行是解释器行,它调用 抄写.
但是,如果您调用 抄写 喜欢这个
$ escript 阶乘 5
第一行内容无所谓,但不能包含Erlang代码
因为它会被忽略。
示例中的第二行包含一个可选的指令 Emacs的 编辑
这导致它进入编辑 Erlang 源文件的主要模式。 如果
指令存在,它必须位于第二行。
如果有评论选择 编码 它可以位于第二行。
请注意:
上述注释指定的编码适用于脚本本身。
但是,I/O 服务器的编码必须像这样显式设置:
io:setopts([{编码, unicode}])
I/O 服务器的默认编码 标准_io is latin1 因为剧本
在非交互式终端中运行(请参阅 运用 统一 in Erlang).
在第三行(或第二行,取决于 Emacs 的存在)
指令),可以给模拟器提供参数,例如
%%! -smp enable -sname factorial -mnesia debug verbose
这样的参数行必须以 %%! 该行的其余部分将被解释
作为模拟器的参数。
如果你知道位置 抄写 可执行,第一行可以直接
给路径 抄写。 例如:
#!/usr/local/bin/escript
与任何其他类型的脚本一样,Erlang 脚本将无法在 Unix 平台上运行,如果
未设置脚本文件的执行位。 (用 CHMOD +x 脚本名称 打开
执行位。)
Erlang 脚本文件的其余部分可能包含 Erlang 资源 码,一个
内联 光束 文件 或 内联 档案 文件.
Erlang 脚本文件必须始终包含函数 主/1. 当脚本是
跑过 主/1 将使用表示
给脚本的参数(未以任何方式更改或解释)。
如果 主/1 脚本中的函数成功返回,退出状态为
script 将为 0。 如果在执行过程中产生异常,一条短消息
将被打印并且脚本以退出状态 127 终止。
要返回您自己的非零退出代码,请调用 停止(退出代码); 例如:
停(1)。
电话联系 脚本:脚本名称() 从您的 to 脚本中检索路径名
脚本(路径名通常但不总是绝对的)。
如果文件包含源代码(如上例所示),它将被处理
预处理器 埃普. 这意味着您例如可以使用预定义的宏
(如 ?模块) 以及包含指令,如 -include_lib 指令。
例如,使用
-include_lib("内核/包含/文件.hrl")。
包括用于记录的记录定义 文件:read_link_info/1
功能。 您还可以通过在此处包含编码注释来选择编码,但如果
第二行有一个有效的编码注释,它优先。
脚本将在运行前检查语法和语义的正确性。
如果有警告(例如未使用的变量),它们会被打印出来,并且
脚本仍将运行。 如果有错误,它们将被打印出来,脚本
将不会运行,其退出状态将为 127。
模块声明和导出声明 主/1 功能是
可选的。
默认情况下,将解释脚本。 你可以强制它被编译
在脚本文件的某处包含以下行:
-模式(编译)。
解释代码的执行比编译代码慢。 如果大部分
执行发生在解释代码中,编译它可能是值得的,即使
虽然编译本身需要一点时间。 也可以
供应 本地人 而不是 编,这将使用本机编译脚本
标志,同样取决于脚本的特征,这可能或不可能
是值得的。
如前所述,可以有一个包含预编译的脚本
光束 代码。 在预编译脚本中,脚本头的解释是
与包含源代码的脚本完全相同。 这意味着你可以
做一个 光束 通过在文件前面加上开头的行来执行文件 #!
和 %%! 上文提到的。 在预编译脚本中,函数 主/1 必须
出口。
作为另一种选择,可以在
脚本。 在归档脚本中,脚本头的解释正是
与包含源代码的脚本相同。 这意味着您可以制作存档
通过在文件前面加上开头的行来执行文件 #! 和 %%!
上文提到的。 在归档脚本中,函数 主/1 必须出口。 经过
默认的 主/1 模块中与基名相同的函数
抄写 文件将被调用。 可以通过设置标志来覆盖此行为
-脚本 主 模块 作为模拟器标志之一。 这 模块 必须是一个名字
具有导出的模块 主/1 功能。 看 码(3erl) 了解更多信息
关于档案和代码加载。
在许多情况下,在 escript 中有一个标题是非常方便的,尤其是在
Unix 平台。 但标题实际上是可选的。 这意味着你直接
可以在不添加任何头文件的情况下“执行”一个 Erlang 模块、beam 文件或存档文件
给他们。 但是你必须像这样调用脚本:
$ 脚本阶乘.erl 5
阶乘 5 = 120
$ 脚本阶乘.beam 5
阶乘 5 = 120
$ escript 阶乘.zip 5
阶乘 5 = 120
脚本:创建(FileOrBin, 节) -> ok | {好的, 二进制()} | {错误, 学期()}
类型:
FileOrBin = 文件名() | '二进制'
部分 = [标题] 正文 | 身体
标题 = shebang | {shebang, Shebang} | 评论 | {评论,评论} |
{emu_args,EmuArgs}
Shebang = string() | '默认' | '不明确的'
评论 = 字符串() | '默认' | '不明确的'
EmuArgs = string() | '不明确的'
正文 = {源代码,源代码} | {光束,光束代码} | {存档,ZipArchive} |
{存档,ZipFiles,ZipOptions}
SourceCode = BeamCode = 文件:文件名() | 二进制()
压缩存档 = 邮编:文件名() | 二进制()
压缩文件 = [压缩文件]
ZipFile = 文件:文件名() | {文件:文件名(),二进制()} | {文件:文件名(),
二进制(),文件:file_info()}
邮编选项 = [邮编:创建选项()]
这个 创建/2 函数从部分列表中创建一个脚本。 部分可以
以任何顺序给出。 一个 escript 以一个可选的开头 标题 其次是
强制性 Body. 如果标题存在,它总是以 家当,
可能后面跟着一个 评论 和 emu_args。 该 家当 默认为 "/usr/bin/环境
脚本". 评论默认为 “这 is an - * - 二郎 - * - 文件”. 创建的
escript 可以作为二进制文件返回或写入文件。
作为如何使用该函数的示例,我们创建了一个解释性脚本
使用 emu_args 设置一些模拟器标志。 在这种情况下,它碰巧禁用
smp_support。 我们也从新创建的文件中提取不同的部分
脚本:
> Source = "%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_support)).\n"。
"%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_support)).\n"
> io:format("~s\n", [来源])。
%% 演示
主要(_Args)->
io:format(erlang:system_info(smp_support))。
ok
> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "-smp disable"}, {source, list_to_binary(Source)}]).
{好的,<<“#!/usr/bin/环境 escript\n%% 这是一个 -*- erlang -*- 文件\n%%!-smp disabl"...>>}
> file:write_file("demo.escript", Bin)。
ok
> os:cmd("escript demo.escript")。
“错误的”
> escript:extract("demo.escript", [])。
{ok,[{shebang,default}, {comment,default}, {emu_args,"-smp disable"},
{source,<<"%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_su"...>>}]}
可以像这样创建没有标题的脚本:
> file:write_file("demo.erl", ["%% demo.erl\n-module(demo).\n-export([main/1]).\n\n", Source]).
ok
> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info])。
{好的,演示,
<<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
79,0,0,0,9,4,100,...>>}
> escript:create("demo.beam", [{beam, BeamCode}])。
ok
> escript:extract("demo.beam", [])。
{好的,[{shebang,undefined},{comment,undefined},{emu_args,undefined},
{梁,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
111,109,0,0,0,83,0,0,0,9,...>>}]}
> os:cmd("escript demo.beam")。
“真正”
在这里,我们创建了一个包含 Erlang 代码和梁代码的存档脚本。
然后我们遍历存档中的所有文件并收集它们的内容和一些
关于他们的信息。
> {ok, SourceCode} = file:read_file("demo.erl")。
{ok,<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
> escript:create("demo.escript", [shebang, {archive, [{"demo.erl", SourceCode}, {"demo.beam", BeamCode}], []}]).
ok
> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
{ok,[{shebang,默认},{评论,未定义},{emu_args,未定义},
{{存档,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
152,61,93,107,0,0,0,118,0,...>>}]}
> file:write_file("demo.zip", ArchiveBin)。
ok
> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
{好的,[{“演示。梁”,
{file_info,748,常规,read_write,
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
54,1,0,0,0,0,0},
<<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
83,0,0,...>>},
{“演示.erl”,
{file_info,118,常规,read_write,
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
54,1,0,0,0,0,0},
<<"%% demo.erl\n-module(demo).\n-export([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
脚本:提取(文件, 选项) -> {好的, 部分} | {错误, 学期()}
类型:
文件 = 文件名()
选项 = [] | [编译源]
部分 = 标题正文
标题 = {shebang, Shebang} {comment, Comment} {emu_args, EmuArgs}
Shebang = string() | '默认' | '不明确的'
评论 = 字符串() | '默认' | '不明确的'
EmuArgs = string() | '不明确的'
正文 = {源代码,源代码} | {source, BeamCode} | {光束,光束代码} | {档案,
压缩档案}
源代码 = BeamCode = ZipArchive = binary()
这个 提取物/2 函数解析 escript 并提取其部分。 这是
反转 创建/2.
即使脚本中不存在所有部分,也会返回所有部分。 如果一个特定的
部分恰好与默认值具有相同的值,提取的值是
设置为原子 默认. 如果缺少某个部分,则将提取的值设置为
原子 未定义.
这个 编译源 选项仅在脚本包含时影响结果 资源
代码。 在这种情况下,Erlang 代码会自动编译并 {来源, 光束代码}
被返回而不是 {来源, 源代码}.
> escript:create("demo.escript", [shebang, {archive, [{"demo.erl", SourceCode}, {"demo.beam", BeamCode}], []}]).
ok
> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
{ok,[{{存档,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
152,61,93,107,0,0,0,118,0,...>>}
{emu_args,未定义}]}
脚本:脚本名称() -> 文件
类型:
文件 = 文件名()
这个 脚本名称/0 函数返回正在执行的脚本的名称。 如果
函数在 escript 的上下文之外被调用,行为是未定义的。
配置 公认 BY 脚本
-C:
无论 mode 属性的值如何,都编译 escript。
-d:
调试脚本。 启动调试器,加载包含 主/1
函数进入调试器,在 主/1 并调用 主/1。 如果
模块是预编译的,它必须用 调试信息 选项。
-一世:
无论 mode 属性的值如何,都解释脚本。
-s:
仅对脚本文件执行句法和语义检查。 警告和错误
(如果有)被写入标准输出,但脚本不会运行。 出口
如果没有错误,状态将为 0,否则为 127。
-n:
使用 +native 标志编译脚本。
使用 onworks.net 服务在线使用 escript
