【问题标题】:How can I exit a multi-line command sequence in the Erlang shell?如何在 Erlang shell 中退出多行命令序列?
【发布时间】:2017-01-26 17:17:39
【问题描述】:

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

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

有没有一种方法可以中断该序列,而不必完全使用 Ctrl C 退出 shell?重新启动 shell 的麻烦是所有变量都丢失了。

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    你可以按 Ctrl-g,这会让你进入这个 erlang 的 shell 中断模式

    的“用户切换命令”

    提示将从>变为--->

    在这种模式下

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

    erlang shell 然后会声明 exception exit:killed 并返回到卡住之前的状态。

    ~ → 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"命令,THX
    【解决方案2】:

    我不知道一个通​​用的方法,我有兴趣知道一个。在我这边,我试图弄清楚 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 最终得到它?
    • @byaruhaf 的答案可以解决问题。正如我现在检查的那样,该答案的内容在“Programming Erlang”书第 2 版的第 10 章中。
    • 我知道我的答案不是预期的,我对通用解决方案很感兴趣 :o)
    猜你喜欢
    • 2017-06-04
    • 2015-11-21
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多