2017-02-09 7 views
3

я ожидал и из них, чтобы вести себя так же, в котором стандартный вывод не является пустым:Groovy строка выполнения против списка выполнения

assert !"bash -c \"ls *.txt\"".execute().text.empty // assertion failure here 
assert !['bash', '-c', 'ls *.txt'].execute().text.empty 

, но они этого не делают. Каковы семантические различия? Для первой строки я подозреваю, что Groovy отправляет ["-c", "\"ls", "*.txt\""] в качестве аргументов в bash, но я не уверен. Может ли кто-нибудь подтвердить это?

ответ

4

Ваше предположение верно. Смотрите код возврата/STDERR из thatt команды:

groovy:000> p = "bash -c \"ls *.txt\"".execute() 
===> [email protected] 
groovy:000> p.waitFor() // exitValue() 
===> 1 
groovy:000> p.errorStream.readLines() 
===> [*.txt": -c: line 0: unexpected EOF while looking for matching `"', *.txt": -c: line 1: syntax error: unexpected end of file] 

Если вы будете следовать источник вниз через https://github.com/apache/groovy/blob/GROOVY_2_4_8/src/main/org/codehaus/groovy/runtime/ProcessGroovyMethods.java#L532-L534 в комплекте JDK

java.lang.Runtime:exec(String command, String[] envp, File dir)

https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String,%20java.lang.String[],%20java.io.File)

вы найдете, что StringTokenizer используется для разделения этой строки/команды, таким образом создавая ваш ", цитирующий для shell useles s. Ведь цитирование нужно только для самой оболочки, а не для ProcessBuilder.

 Смежные вопросы

  • Нет связанных вопросов^_^