如何退出Erlang shell中的多行命令序列?

时间:2017-01-26 03:54:20

标签: erlang erlang-shell

有时在Erlang shell中,如果我输入错误命令并按Enter键,shell将转到下一行,以期该命令将继续(因此左侧的行号保持不变)。

例如,我现在错误地(故意)键入X而不是1> $"X".。按Enter键后,现在命令行卡在1> $X.上。我已经尝试键入1>,然后按Enter键,只需输入以希望终止命令序列,但它不起作用。虽然我已经尝试过,但很难在谷歌上查看这一点,因为非常常见的关键字会导致其他结果。

有没有办法可以打破这个序列,而不必完全用Ctrl C退出shell?重新启动shell的麻烦是所有变量都丢失了。

2 个答案:

答案 0 :(得分:4)

你可以点击Ctrl-g,这会让你进入“用户切换命令”这个二郎的 shell破解模式

提示将从> 更改为 --->

在此模式下

  • 键入 i 以中断您的erlang会话
  • 然后输入 c 重新连接
然后,erlang shell将声明异常退出:已杀死并返回到卡住之前的状态。

~ → erl
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

local recon loaded
local stdlib2 loaded
Eshell V8.2  (abort with ^G)
1> $"X".
1> l
1> .
1> .
1>
User switch command
 --> i
 --> c
** exception exit: killed
1> R=22.
22
2> $"X".
2>
User switch command
 --> i
 --> c
** exception exit: killed
2> b().
R = 22
ok
3>

答案 1 :(得分:0)

我不知道一种普遍的方式,我有兴趣知道一个。在我这边,我试着找出shell期待的东西,在你的例子中,shell"想到"您正在键入一个字符串:

第一个$"被解释为字符'"',因此下一个'"'被解释为字符串的开头,而shell正在等待字符串的结尾。开始将下一个点解释为表达式的结尾。

输入".,您将收到新提示。

修改

当shell直接检测到错误时,在评估表达式之前,提示编号不会改变,因为没有结果存储:

1> $"X".
1> ".
* 1: syntax error before: X
1> lists:seq(1,5). 
[1,2,3,4,5]
2>

如果在评估输入期间检测到错误,则提示编号会递增。从shell的角度来看,成功评估和有缺陷评估之间没有区别,在这两种情况下,评估都会返回结果:

2> lists:seq("1","5").
** exception error: no function clause matching lists:seq("1","5") (lists.erl, line 243)
3>

每个评估的结果都由shell存储,可以使用v(N):

进行检索
3> v(1).
[1,2,3,4,5]
4> v(2).
{'EXIT',{function_clause,[{lists,seq,
                                 ["1","5"],
                                 [{file,"lists.erl"},{line,243}]},
                          {erl_eval,do_apply,6,
                                    [{file,"erl_eval.erl"},{line,674}]},
                          {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                          {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
                          {shell,eval_loop,3,
                                 [{file,"shell.erl"},{line,626}]}]}}
5>