Groovy: перенаправление stdout в файл не работает - PullRequest
2 голосов
/ 21 декабря 2011

Я только учусь заводить. У меня есть очень простой скрипт, который выводит некоторый текст в STDERR и STDOUT с помощью println:

err = System.err    
resultStr = "test to print"
err.println resultStr
println resultStr

Если я затем запускаю скрипт без перенаправления, я получаю строку resultStr в выходных данных два раза.

Если я перенаправлю вывод в файл с test > test.txt, результирующая строка появляется один раз в выводе (ОК), test.txt создается (ОК), но это пусто . Я пытался сделать System.out.println вместо println с тем же результатом. Что я делаю не так?

Если это важно, я на Windows 7. На всякий случай я попытался перенаправить вывод стандартных программ Windows, таких как dir, и это работает.

Groovy версия: 1.8.4 JVM: 1.7.0_02

ОБНОВЛЕНИЕ : я также пытался создать простой "Hello World" класс в Java (та же JVM). Перенаправление работает. Так что должно быть что-то в Groovy.

ОБНОВЛЕНИЕ 2 : После комментария от @ socha23 о том, что он может успешно перенаправить из того же сценария в Windows 7, я подумал, что проблема не в сценарии, а в установке Groovy, конфликтах версий или ОС , Поэтому я задал аналогичный вопрос для SuperUser (извините за перекрестную публикацию, но я действительно думал, что это пограничный вопрос).

Затем я обнаружил, что перенаправление не работает должным образом, если я запускаю сценарий напрямую как test.groovy > test.txt. Но если я запускаю groovy test.groovy > test.txt, это работает. Я все еще хотел бы понять это поведение и исправить, если это возможно. Пожалуйста, посетите вопрос SU. На сегодняшний день 12/24, это все еще без ответа.

Я думаю, теперь понятно, что это не вопрос программирования. Пожалуйста, порекомендуйте мне удалить его отсюда. Оба вопроса относятся друг к другу.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Вы используете Windows 7 64-bit?Попробуйте, если это исправление от MS решает вашу проблему: http://support.microsoft.com/kb/971163/en-us Это может применяться, если перенаправление вывода не работает с определенной программой, но вывод на консоли работает.(По какой-то причине исправление не устанавливается на моем компьютере.)

Насколько я понимаю, проблема, если вы вызываете groovy напрямую, не вызывает API-вызов для CreateProcessWithTokenW, тогда как если вы используете оболочку,то есть "test.groovy> file.txt", он вызывает эту функцию API, что приводит к ошибке.

ОБНОВЛЕНИЕ:

Тем временем я обнаружил, чтоЭто исправление включено в Windows 7 SP1, поэтому оно не будет установлено на вашем компьютере и на моем компьютере.Единственная другая связанная с этим ошибка, которую я обнаружил, это: http://support.microsoft.com/kb/321788,, но она предположительно была исправлена ​​во времена Windows XP.

Я сильно подозреваю, что код перенаправления вывода в Windows все еще содержит ошибки, так как я имелта же проблема, что и у вас с другой программой, и она может быть исправлена ​​путем изменения исходного кода, но таким способом, который не имеет смысла.

0 голосов
/ 24 декабря 2011

Ваши результаты имеют смысл для меня, стандартное перенаправление ">" работает только на стандартный выход. И в bash, и, я уверен, в DOS, вам нужно выполнить «2>», чтобы перенаправить стандартный вывод ошибок в файл. Следующий скрипт доказывает это, по крайней мере, на bash. Командная строка DOS для меня работала примерно так же.

System.out.println "Hello Standard Out"
System.err.println "Hello Standard Err"

println "Hello plain-jane println"

Простой тест перенаправления имеет stdout.txt, показывающий «Hello Standard Out» и «Hello plain-jane println», но НЕ «Hello Standard Err», он появляется на консоли.

bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout.txt
Hello Standard Err
bobk-mbp:hello bobk$

Мой следующий тест явно перенаправляет стандартную ошибку out и standard, в результате чего stdout2.txt показывает «Hello Standard Out» и «Hello plain-jane println», а stderr2.txt показывает «Hello Standard Err».

bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout2.txt 2>stderr2.txt
bobk-mbp:hello bobk$

Я удивлен, что ваши результаты в стандартной java отличаются от того, что вы пытаетесь сделать, имеет мало общего с виртуальной машиной и имеет много общего с оболочкой.

...