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

3
有时候在Erlang shell中,如果我输错了命令并按下回车键,shell会转到下一行,以期待命令继续进行(所以左侧的行号保持不变)。
例如,我刚才故意输入了1>$"X".而不是1>$X.。按下回车键后,现在命令行卡在了1>上。我已经尝试过输入.然后按回车键,以及只输入回车键,希望终止命令序列,但这都不起作用。尽管我已经尝试过,但很难在谷歌上查找到答案,因为常见的关键词会导致其他结果。
有没有办法可以在不完全退出shell的情况下打破该序列?重新启动shell的麻烦在于所有变量都会丢失。
2个回答

6
你可以按Ctrl-g,进入“用户切换命令”,这是erlang的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>

我总是使用^G在同一节点中启动新的shell,我从未尝试过"i"命令,谢谢。 - Pascal

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>

这当然是我一直在尝试做的事情,但通常都不成功。通常经过几次猜测后,我就放弃了,回到手头的任务上。关于你所写的内容,它并没有立即生效,但经过几次重复之后,终于成功了。 `5> $"A". 5> ".
  • 1: syntax error before: A 5> ". 5> ". ".\n" 6>`。感谢您帮助我解决问题!顺便问一下,您有什么线索可以解释为什么我必须重复输入才能让 shell 最终理解它吗?
- Jordan
@byaruhaf的回答解决了问题。我已经确认,该回答的内容在第二版《Programming Erlang》书籍的第10章中。 - Jordan
我知道我的答案不是你期望的,但我对一个通用解决方案很感兴趣 :o) - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接