如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?

ijt*_*ijt 2 erlang

以下使erl挂起:

$ erl
Erlang/OTP 24 [erts-12.1] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:1] [jit] [dtrace]

Eshell V12.1  (abort with ^G)
1> receive X -> X end.
Run Code Online (Sandbox Code Playgroud)

按 ctrl-C 会弹出一个选项菜单:

BREAK: (a)bort (A)bort with dump (c)ontinue (p)roc info (i)nfo
Run Code Online (Sandbox Code Playgroud)

然而,我还没有发现其中任何一个让我回到提示符erl。是不是你必须通过选择“(a)bort”然后erl重新开始来让它崩溃?

Ste*_*ski 6

答案就在 shell 提示符上方的括号中:

(abort with ^G)
Run Code Online (Sandbox Code Playgroud)

如果按 ctrl-G,您会看到用户切换命令提示符。您可以h在此提示下键入以查看可以执行的操作:

User switch command
--> h
 c [nn]            - connect to job
 i [nn]            - interrupt job
 k [nn]            - kill job
 j                 - list all jobs
 s [shell]         - start local shell
 r [node [shell]]  - start remote shell
 q                 - quit erlang
 ? | h             - this message
Run Code Online (Sandbox Code Playgroud)

让我们列出职位:

--> j
  1* {shell,start,[init]}
Run Code Online (Sandbox Code Playgroud)

这就是运行你的receive. 您可以使用 杀死它k,然后j显示没有作业正在运行,因此然后使用s启动一个新的 shell,j然后显示,然后使用c连接到该新 shell:

--> k 1
--> j
--> s
--> j
  2* {shell,start,[]}
--> c 2
Eshell V12.1  (abort with ^G)
1>
Run Code Online (Sandbox Code Playgroud)