4

如果您键入以下内容,则在 groovy shell 中:

$ groovysh
Groovy Shell (2.3.7, JVM: 1.7.0_11)
Type ':help' or ':h' for help.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
groovy:000> (1..1234567)

并且不小心按了 Enter,您很可能会破坏当前会话,并且没有太多希望能够继续。这是一个简单的例子 - 假设你做了类似的事情:

(1..123456).collect { 'abc' * 80 }

你明白了要点——显然你可以在控制台中做一些事情,在那里你有你想要继续工作的状态。有什么方法可以告诉 groovy 停止,但不杀死 groovysh(哪个Ctrl+C)?

或者或者告诉它每次打印更少,除非要求更多?不确定有什么可能,如果有的话 - 有什么提示吗?

4

1 回答 1

1

在 Windows 中,Groovysh 似乎不会将 ctrl-c 作为中断信号转发给应用程序。如果我运行这个:

while(true)Thread.sleep(1000);

或这个:

while(true);

在 groovyconsole 中它可以被中断,但是当我在 Groovysh 中做同样的事情时它不能,它只是挂起直到我终止进程。

其中一些与 groovy 用于输入的 JLine 有关,因为如果我像这样禁用 jline:

groovysh -console=false

然后 ctrl-c 杀死整个过程而不是忽略 ctrl-c。也许它正试图捕捉和转发 ctrl-c 并且转发部分搞砸了?

GroovyConsole 可以轻松地“捕捉” ctrl-c,因为 windows 不会将它作为中断传递,它只是输入。对于像 Groovysh 这样的控制台应用程序,捕获 SIGINT 显然非常困难(尽管它可能是可能的,但我没有亲自尝试过)也许这就是他们试图用 JLine 做的事情,只是在 windows 实现中有一个错误或还没完成...

修复这个问题会很好,但除非我可以编写自己的 repl GUI,比如像 GroovyConsole 这样维护它的状态,比如 Groovysh。

于 2014-11-20T01:42:03.473 回答