Groovy Shell中的中断处理

4

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

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

如果你不小心按下了回车键,你很有可能会毁掉当前的会话,并且没有太多希望能够继续。这只是一个简单的例子 - 假设你做了这样的事情:

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

你大概明白了——显然你可以在控制台中进行一些状态处理。有没有一种方法告诉Groovy停止,但不杀掉groovysh(Ctrl+C)呢?或者,每次打印少一点,除非要求更多?不确定什么是可能的,如果有的话,有什么提示吗?

我差点建议使用Groovy控制台。它有启用中断选项和一个中断按钮。可惜它不起作用。我使用Intellij进行小型脚本编写。它可以暂停/终止正在运行的脚本。不确定这是否对你有帮助。 - Jayan
https://dev59.com/lVrUa4cB1Zd3GeqPhTDZ - Jayan
1个回答

1
在Windows系统中,Groovysh似乎无法将ctrl-c转发给应用程序作为中断信号。如果我运行以下命令:
while(true)Thread.sleep(1000);

或者这个:
while(true);

在Groovy控制台中,可以使用中断功能,但是在Groovysh中执行相同操作时却无法中断,只能一直等待直到我杀死进程。这与Groovy用于输入的JLine有关,因为如果我像这样禁用jline:
groovysh -console=false

然后ctrl-c会终止整个进程而不是忽略ctrl-c。也许它试图捕获和转发ctrl-c,但在转发部分出了问题?GroovyConsole可以轻松“捕获”ctrl-c,因为Windows将其作为输入而不是中断。对于像Groovysh这样的控制台应用程序,显然很难捕获SIGINT(虽然可能是可能,但我个人还没有尝试过)。也许这就是他们想要使用JLine做的事情,只是在Windows实现中存在错误或尚未完成...希望能够解决这个问题,但如果无法解决,我可能会编写自己的repl GUI,就像保持类似Groovysh的状态的GroovyConsole一样。

谢谢Bill K - 看起来我应该提到,我在Linux上。然而,同意 - 在这两种情况下,问题是它终止了会话,即我不知道有没有办法中断最后的处理而不是终止整个会话。 - levant pied
如果这对你非常重要,你可以查看我帖子中的链接(抱歉它是一个PDF文件,在其他地方找不到信息),它似乎是一种让Java允许你处理SIGINT而不仅仅是退出的方法。你可能能够在默认情况下加载到shell中的groovy类中完成这个操作。当我有时间时,我可能会尝试这种方法。 - Bill K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接