Обработка прерываний в 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)?

Или, в качестве альтернативы, скажите ему печатать меньше каждый раз, если не будет запрошено больше? Не уверен, что возможно, если что-нибудь - какие-нибудь намеки?


person levant pied    schedule 29.10.2014    source источник
comment
Я почти предложил заводную консоль. У него была опция включения прерывания и кнопка прерывания. К сожалению, это не работает. Я использую intellij для небольших сценариев. Он может приостановить/убить запущенный скрипт. Не уверен, что это поможет в вашем случае.   -  person Jayan    schedule 01.11.2014
comment
stackoverflow.com/questions/7035609 /   -  person Jayan    schedule 01.11.2014


Ответы (1)


В Windows Groovysh, похоже, не перенаправляет Ctrl-C в приложение в качестве сигнала прерывания. Если я запускаю это:

while(true)Thread.sleep(1000);

или это:

while(true);

в groovyconsole его можно прервать, но когда я делаю то же самое в Groovysh, он не может, он просто висит, пока я не убью процесс.

Частично это связано с JLine, которую groovy использует для ввода, потому что если я отключу jline следующим образом:

groovysh -console=false

затем ctrl-c убивает весь процесс вместо того, чтобы игнорировать ctrl-c. Может быть, он пытается поймать и переслать ctrl-c, и что-то не так с частью пересылки?

GroovyConsole может легко «поймать» Ctrl-C, потому что Windows не передает его как прерывание, это просто ввод. для консольного приложения, такого как Groovysh, довольно сложно поймать SIGINT (хотя это может быть возможно, я лично не пробовал) Возможно, это то, что они пытаются сделать с JLine, и просто есть ошибка в реализации Windows или еще не завершена...

Было бы неплохо исправить это, но за исключением того, что я могу написать свой собственный графический интерфейс repl, такой как GroovyConsole, который поддерживает свое состояние, как Groovysh.

person Bill K    schedule 20.11.2014
comment
Спасибо, Билл К. - похоже, я должен был упомянуть, что я на Linux. Однако согласен - в обоих случаях проблема в том, что он убивает сессию, т.е. я не знаю способа прервать последнюю обработку вместо того, чтобы убивать всю сессию. - person levant pied; 20.11.2014
comment
Если это действительно важно для вас, вы можете проверить ссылку в моем посте (извините, это PDF, я не смог найти информацию где-либо еще), кажется, это способ заставить Java позволить вам обрабатывать SIGINT вместо того, чтобы просто спасать . Вы МОЖЕТЕ сделать это в классном классе, который вы загружаете в оболочку по умолчанию. Я, вероятно, попробую этот подход, когда у меня будет немного времени. - person Bill K; 20.11.2014