原文 2013-11-21 21:39:07 发表于 CSDN,这里对以前写的文章做下收录。
erlang shell 是在命令行模式下使用命令和 erlang 交互的工具。erlang shell功能十分强大,可以直接编译、加载、执行、调试模块等等,完全可以将shell做为erlang项目的终端使用。文章将对erlang shell 命令做介绍,还简单以示例说明。
打开erlang shell的帮助信息,在这里变成中文了。同时可以看下官方文档
shell 函数帮助
Eshell V5.10.2 (abort with ^G) 1> help(). ** shell 内置命令 ** b() -- 显示所有绑定的变量 e(N) -- 重复某次查询 <N> f() -- 释放所有绑定的变量 f(X) -- 释放某个绑定的变量 h() -- 显示之前的操作 history(N) -- 设置保存之前操作命令的条数 results(N) -- 设置保存之前操作结果的条数 catch_exception(Bool) -- 设置的执行过程中的异常处理 v(N) -- 使用某次查询的值 <N> rd(R,D) -- 定义一个 record rf() -- 移除所有 record rf(R) -- 移除某个 record rl() -- 显示所有 record rl(R) -- 显示某个 record 信息 rp(Term) -- 显示某个元组的所有内容 rr(File) -- 从一个文件或模块读取 record 定义
** c 模块命令 ** bt(Pid) -- 显示一个进程的栈回溯 c(File) -- 编译及重新加载模块 cd(Dir) -- 改变工作目录 flush() -- 刷新信箱(以便shell接收信息) help() -- 帮助信息 i() -- 显示系统信息 ni() -- 和 i() 一样显示系统信息,还包括网络节点的系统信息 i(X,Y,Z) -- 通过 pid <X,Y,Z> 获取某个进程的信息 l(Module) -- 加载或重新加载模块 lc([File]) -- 编译一个列表的 Erlang 模块 ls() -- 显示当前工作目录下的文件列表 ls(Dir) -- 显示某个目录下的文件列表 m() -- 显示已加载进系统的模块 m(Mod) -- 显示某个模块信息 memory() -- 显示内存分配信息 memory(T) -- 显示某项内存分配信息 <T> nc(File) -- 在所有节点编译及加载模块 nl(Module) -- 在所有节点重新加载模块 pid(X,Y,Z) -- 通过 pid <X,Y,Z> 获取某个进程 pid pwd() -- 显示当前工作目录 q() -- 关闭 erlang shell regs() -- 显示注册过的进程信息 nregs() -- 和 regs() 一样显示注册过的进程信息,还包括网络节点的进程信息 xm(M) -- 查找某个模块未定义的函数,未使用的函数,已弃用的函数 y(File) -- 编译 Yecc 文件(.yrl) ** i 模块命令 ** ih() -- 显示 i 模块的帮助信息 true
shell 函数说明
1、显示绑定变量
b() -- 显示所有绑定的变量
1> [A,B,C] = [1,2,3]. [1,2,3] 2> b(). A = 1 B = 2 C = 3 ok
2、重复查询
e(N) -- 重复某次查询
3> e(1). [1,2,3]
3、释放绑定变量
f() -- 释放所有绑定的变量
f(X) -- 释放某个绑定的变量
4> A. 1 5> f(A). ok 6> A. * 1: variable 'A' is unbound 7> B. 2 8> f(). ok 9> B. * 1: variable 'B' is unbound 10> C. * 1: variable 'C' is unbound
4、使用查询结果
v(N) -- 使用某次查询的值
11> A1 = v(4). 1 12> A1. 1
5、record 操作
rd(R,D) -- 定义一个 record
rf() -- 移除所有 record
rf(R) -- 移除某个 record
rl() -- 显示所有 record
rl(R) -- 显示某个 record 信息
13> rd(person, {name, age, address, salary, children}). person 14> rd(child, {name, age}). child 15> rl(). -record(child,{name,age}). -record(person,{name,age,address,salary,children}). ok 16> rl(child). -record(child,{name,age}). ok
6、显示元组内容
rp(Term) -- 显示某个元组的所有内容
erlang shell会自动省略内容太长的元组,使用rp命令可以完整显示出来
17> lists:seq(1,50). [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28,29|...] 18> rp(lists:seq(1,50)). [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42, 43,44,45,46,47,48,49,50] ok
7、工作目录
cd(Dir) -- 改变工作目录
pwd() -- 获取工作目录
19> pwd(). d:/tmp ok 20> cd("d:/"). d:/ ok 21> pwd(). d:/ ok
8、进程操作
self() -- 获取当前进程 pid
pid(X,Y,Z) -- 通过 pid <X,Y,Z> 获取某个进程 pid exit(Pid) -- 杀死某个进程 catch_exception(Bool) -- 设置的执行过程中的异常处理 22> self(). <0.31.0> 23> catch_exception(false). true 24> exit(pid(0,31,0)). ** exception exit: <0.31.0> 25> self(). <0.33.0> 26> catch_exception(true). false 27> exit(pid(0,33,0)). * exception exit: <0.33.0> 28> self(). <0.33.0>
您好,我读了你在博客园发表的文章https://www.cnblogs.com/quitboy/p/4256762.html,看到您在最后附上了.beam文件读取工具,但是网站已经挂了,如果工具还在的话不知道能否发我一份,谢谢!
^_^ 你好,原来博客不是我写的,我尝试找到那个文件,没找到。所以,我看了erlang的源代码,其中也有解析beam文件的过程,主要是 beam_lib.erl ,可从 beam_lib:info/1 入手看