如何在 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>
有时在 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>