有时在Erlang shell中,如果我输入错误命令并按Enter键,shell将转到下一行,以期该命令将继续(因此左侧的行号保持不变)。
例如,我现在错误地(故意)键入X
而不是1> $"X".
。按Enter键后,现在命令行卡在1> $X.
上。我已经尝试键入1>
,然后按Enter键,只需输入以希望终止命令序列,但它不起作用。虽然我已经尝试过,但很难在谷歌上查看这一点,因为非常常见的关键字会导致其他结果。
有没有办法可以打破这个序列,而不必完全用Ctrl C退出shell?重新启动shell的麻烦是所有变量都丢失了。
答案 0 :(得分:4)
你可以点击Ctrl-g,这会让你进入“用户切换命令”这个二郎的 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>