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

How can I exit a multi-line command sequence in the Erlang shell?

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

例如,我刚才(故意)错误地输入了 1> $"X". 而不是 1> $X.。按 Enter 后,现在命令行停留在 1>。我曾尝试键入 . 后跟 Enter 并简单地 Enter 以终止命令序列,但它不起作用。尽管我已经尝试过,但很难在 google 上查找,因为非常常见的关键字会导致其他结果。

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

我不知道通用的方法,我有兴趣知道一个。在我这边,我试图弄清楚 shell 期望什么,在您的示例中,您正在输入字符串的 shell "thinks":

第一个$"被解释为字符'"',所以下一个'"'被解释为字符串的开头,shell等待开始将下一个点解释为表达式结束之前的字符串结尾。

输入".,你会得到一个新的提示。

编辑

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

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

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

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>

你可以点击 Ctrl-g,这会让你进入 "User switch command" 这个 erlang 的 shell 中断模式

提示将从>变为--->.

在此模式下

  • 键入 i 中断您的 erlang 会话
  • 然后输入 c 重新连接

erlang shell 然后会将 exception exit: killed 和 return 声明为卡住之前的状态。

~ → 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>