Erlang Shell的使用

1.1 shell起动

假设你已经安装了Erlang/OTP。如果用的是LinuxMac 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作为守护进程运行时可采用这个方法。

<!--[if !supportLists]-->1.2 <!--[endif]-->输入表达式

首先在shell下输入的并不是什么命令,而是表达式,两者的区别在于表达式一定有返回值(求值结果)。表达式求值完毕,shell会打印出求值结果。Shell会记住求值结果,后续可以用v(1) v(2)这样的语法引用它们。

 

<!--[if !supportLists]-->1.2.1 <!--[endif]--> 以句号结束

表达式为什么加上一个句号呢?因为erlang的表达式以句号结束。

在回车之前,必须用句点告诉shell表达式已经输入完毕。如果不输入句号就回车,shell会一直提示你输入更多字符(提示符编号不会增加),就像下面这样:

 

要是一开始忘记了句点,不用担心,补上之后敲回车就行了。

<!--[if !supportLists]-->1.2.2 <!--[endif]--> 输入带引号的字符串

这是一个初学者都会遇到的碰壁问题,看了后会顿开茅塞:输入字符串,当输入双引号与单引号时,有一个特别值的注意的问题,如果忘了结尾的引号就回车,shell会同样的提示符提示继续等待更多的输入,这跟上一个忘记句号的例子差不多。如果碰到这个情况,可以输入匹配的引号后再跟一个句号,然后回车。例如:

 

 

引号一定要匹配。引号里的句号是字符串的一部分。

 

也可以用Ctrl+p找回进行重新编辑,Ctrl+n, 方向键,及v(N)竺。

 

<!--[if !supportLists]-->1.3 <!--[endif]-->shell函数

Erlang中有一类像v(N)这样的涵数,它们只存在于shell中。这些shell函数的名字通常比较晦涩。要获得完整的shell函数清单,可以输入help()(也是一个shell函数)。

 

<!--[if !supportLists]-->1.4 <!--[endif]-->退出shell

方法有很多种,这些方法你应该熟悉,在管理和调试系统时它们各有各的作用。我们从对系统最友好的方法开始。

<!--[if !supportLists]-->1.4.1 <!--[endif]--> q().init:stop().

最安全的方法,它是上一节提到的shell函数q()。这是init:stop()函数的一个简写形式(也可以直接输入>init:stop(). )。该函数以一种可控的方法关闭整个Erlang系统,它会通知正在运行的应用停止运行并给它们预留出响应时间。通常整个过程在几秒内完成,但线上系统由于运行的进程多,可以需要花费更多的时间来完成各种清理工作。

<!--[if !supportLists]-->1.4.2 <!--[endif]--> BREAK菜单

任何情况下:在类UNIX系统下你可以按Ctrl+c唤出底层的BREAK菜单,在Windows下可以在werl终端(erl终端不可以使用,使用时会直接关闭该终端,即结束系统的运行)下用Ctrl+Break唤出该菜单。

 

(a)退出系统(硬停机)   (c)   返回shell (v)打印当前运行的Erlang版本,其他选项,等你成为erlang专家后,会发现这些信息对你调试很有用;(k)可以让你浏览所有Erlnag内部活动及至强制关闭任何故障的进程,前提是你明确知道自己在做什么。注意shell本身感知不到BREAK菜单,因此(c)返回shell时,需要回车提示符才会显示。

 

<!--[if !supportLists]-->1.4.3 <!--[endif]--> Ctrl+G (退出同BREAK

第三个也是最有用的一个退出方法,就是用Ctrl+G吹出用户开关命令菜单。这么做会令Erlang输出这么一段晦涩的文字:

 

键入h或?并回车,你将看到以下的list

 

在提示符下,可以键入c 回车返回shell

键入q 会硬停机,就跟BREAK菜单下的(a)一样----别把这个qshell函数q()混淆!后者对系统更友好。另外注意BREAK菜单位居更底层,你可以在Ctrl+G菜单中唤出BREAK菜单,反之则不行。

<!--[if !supportLists]-->1.5 <!--[endif]-->任务控制基础

假设你在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任务相关联的东西都会消失。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值