如何在 GHCI 中中止执行?

How to abort execution in GHCI?

当我启动时

ghci> last [0..]

我可以用Ctrl+C打断

但是

ghci> last (repeat 0)

无法使用 Ctrl+C 中止。 GHCI 默默地忽略击键。

如何在 GHCI 中中止此命令?这是一个错误吗?

(警告讲师:我在 urxvt 或 gnome-terminal 上使用 Linux 和 运行 zsh。如果您使用不同的操作系统、终端或 shell,则有可能这对你来说会有所不同。)

我通常处理这个问题的方法是按 Ctrl+Z(将其置于后台,作为副作用完全暂停执行)然后终止作业。通常这是 kill %1,但您可以 运行 jobs 仔细检查。

您也可以启动一个新终端并执行 killall -9 ghci 之类的操作,但这会消耗更多资源:您正在生成一些新进程,打开 X 连接,做终端做的任何事情当它初始化自己时,做你的 shell 当它初始化自己时做的任何事情,等等。如果你处于这种情况,我经常发现自己处于 - ghci 正在疯狂地交换 - 这只会给 ghci 更多时间把事情搞砸。

Ctrl+Z似乎离开了shell,但并没有完全关闭进程。

例如

$ ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> 
[4]+  Stopped                 ghci
$ ps
  PID TTY          TIME CMD
 3160 pts/1    00:00:00 bash
 3554 pts/1    00:00:21 emacs
 5602 pts/1    00:00:00 ghc
 5693 pts/1    00:00:00 ps

但是如果你这样做 Ctrl+D

$ ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> 
Leaving GHCi.
$ ps
  PID TTY          TIME CMD
 3160 pts/1    00:00:00 bash
 3554 pts/1    00:00:21 emacs
 5870 pts/1    00:00:00 ps

所以关闭haskell-shell的正确方法是点击Ctrl+D.

注意:在 Linux(Ubuntu 16.04 LTS)

上测试

您可以使用 :quit 命令退出 GHCI

Prelude> :quit
Leaving GHCi.

或者按 Control+Dsends EOF signal.

如果 GHCI 很忙,你别无选择,只能手动终止进程。