1.1 shell起动
假设你已经安装了Erlang/OTP。如果用的是Linux、Mac OS X、或者其他类UNIX系统,启动一个终端并运行erl命令即可。如果是Windows系统,你应该点击安装程序替你生成的Erlang图标,随后会启动名为werl的程序,这样可以避免直接在Windows终端下交互式运行erl碰到的一些问题。(如Ctrl+C Ctrl+G Ctrl+break的问题)
1>是提示符。随着你不断地输入命令,它还会依次变为2>。你可以用上、下方向键或Ctrl+P/Ctrl+N键上下切换之前输入的表达式。另外还有几个Emacs风格的快捷键,但大部分都比较常规。
我们可以用 -noshell 标志启动Eralng系统,像这样(在你的终端命令行):
erl -noshell
在这种情况下,你无法通过终端与启动后的Erlang系统进行交互。要执行批处理任务或要将Erlang作为守护进程运行时可采用这个方法。
1.2 输入表达式
首先在shell下输入的并不是什么命令,而是表达式,两者的区别在于表达式一定有返回值(求值结果)。表达式求值完毕,shell会打印出求值结果。Shell会记住求值结果,后续可以用v(1) 、v(2)这样的语法引用它们。
1.2.1 以句号结束
表达式为什么加上一个句号呢?因为erlang的表达式以句号结束。
在回车之前,必须用句点告诉shell表达式已经输入完毕。如果不输入句号就回车,shell会一直提示你输入更多字符(提示符编号不会增加),就像下面这样:
要是一开始忘记了句点,不用担心,补上之后敲回车就行了。
1.2.2 输入带引号的字符串
这是一个初学者都会遇到的碰壁问题,看了后会顿开茅塞:输入字符串,当输入双引号与单引号时,有一个特别值的注意的问题,如果忘了结尾的引号就回车,shell会同样的提示符提示继续等待更多的输入,这跟上一个忘记句号的例子差不多。如果碰到这个情况,可以输入匹配的引号后再跟一个句号,然后回车。例如:
引号一定要匹配。引号里的句号是字符串的一部分。
也可以用Ctrl+p找回进行重新编辑,Ctrl+n, 方向键,及v(N)竺。
1.3 shell函数
在Erlang中有一类像v(N)这样的涵数,它们只存在于shell中。这些shell函数的名字通常比较晦涩。要获得完整的shell函数清单,可以输入help()(也是一个shell函数)。
1.4 退出shell
方法有很多种,这些方法你应该熟悉,在管理和调试系统时它们各有各的作用。我们从对系统最友好的方法开始。
1.4.1 q().或init:stop().
最安全的方法,它是上一节提到的shell函数q()。这是init:stop()函数的一个简写形式(也可以直接输入>init:stop(). )。该函数以一种可控的方法关闭整个Erlang系统,它会通知正在运行的应用停止运行并给它们预留出响应时间。通常整个过程在几秒内完成,但线上系统由于运行的进程多,可以需要花费更多的时间来完成各种清理工作。
1.4.2 BREAK菜单
任何情况下:在类UNIX系统下你可以按Ctrl+c唤出底层的BREAK菜单,在Windows下可以在werl终端(erl终端不可以使用,使用时会直接关闭该终端,即结束系统的运行)下用Ctrl+Break唤出该菜单。
(a)退出系统(硬停机) (c) 返回shell (v)打印当前运行的Erlang版本,其他选项,等你成为erlang专家后,会发现这些信息对你调试很有用;(k)可以让你浏览所有Erlnag内部活动及至强制关闭任何故障的进程,前提是你明确知道自己在做什么。注意shell本身感知不到BREAK菜单,因此(c)返回shell时,需要回车提示符才会显示。
1.4.3 Ctrl+G (退出同BREAK)
第三个也是最有用的一个退出方法,就是用Ctrl+G吹出用户开关命令菜单。这么做会令Erlang输出这么一段晦涩的文字:
键入h或?并回车,你将看到以下的list
在提示符下,可以键入c 回车返回shell。
键入q 会硬停机,就跟BREAK菜单下的(a)一样----别把这个q跟shell函数q()混淆!后者对系统更友好。另外注意BREAK菜单位居更底层,你可以在Ctrl+G菜单中唤出BREAK菜单,反之则不行。
1.5 任务控制基础
假设你在Erlang提示符前,一不小心执行了一个跑起来刹不住车的程序(或者你等不及它跑完)。我们时不是总会干出这样的事情。这时你固然可以用以上的几种方法去关闭Erlang系统,再重启。但是,Erlang化的做法是取消当前任务后重启一个新任务(尤其系统中正运行着一些不能中断的重要进程时,从而不对系统其他方面造成任何影响)。
模拟一下这个情形,在Erlang提示符下输入如下内容:
timer:sleep(infinity).
假设我们输入timer:sleep(10000000).
现在shell被锁死了,要解决这个问题,先用Ctrl+G唤出上一节中介绍的用户开命令菜单,然后键入j列出当前的任务。这时应该只有一个任务,所以你会看到如下的情况:
键入C还是锁死状态,键入s(在本地系统上)启动一个新的shell任务,跟之前用的那个一样,然后在键入j查看所有任务,你可以键入c 2,另外由于2号任务已经被*标记为默认选项,也可以键入c进行连接:
这样你又回来了,但是等等,原来的任务呢?再键入Ctrl+G,列出任务,你会看到它仍旧挂在那里。我们可以输入k 1来关掉它,也可以让它继续挂着运行。也可以时行任务的相互切换。
干这类事情,务必确认你关闭的是那个任务,特别是生产系统。一旦进程关闭后,它所有的历史记录、先前的求值结果,以及一切与这个shell任务相关联的东西都会消失。