Есть ли разница между java run.exec команды и выполнения оболочки? - PullRequest
0 голосов
/ 14 ноября 2009

У меня есть программа, которая вызывает команду оболочки. Когда я выполняю команду, используя java run.exec, она не работает, но когда я выполняю команду непосредственно в терминале, она работает как шарм.

ex: pdf2swf "3bbba47.pdf" -T 9 -o "3bbba47.swf" didnt worked
    from java program but worked directly executing it in terminal.

Но когда я попытался удалить кавычки из команды

pdf2swf 3bbba47.pdf -T 9 -o 3bbba47.swf

Работает нормально как в run.exec, так и в терминале.

Почему это так?

Я пробовал и в Mac, и в Ubuntu, и закончил с тем же результатом.

Ответы [ 3 ]

2 голосов
/ 14 ноября 2009

run.exec () не вызывает оболочку. Оболочка анализирует командную строку и эффективно удаляет кавычки, прежде чем передать их в качестве аргументов pdf2swf. Вы можете запускать «сырые» команды только с помощью run.exec ().

Вы можете, если хотите, запустить shell с помощью run.exec () и заставить его проанализировать вашу команду как команду оболочки. Цитирование будет немного болезненным, но выполнимым.

1 голос
/ 14 ноября 2009

Когда вы находитесь в оболочке, символ кавычки интерпретируется до того, как оболочка передаст его JVM.

Когда вы находитесь в run.exec, кавычки считаются частью команды, поэтому JVM считает, что вы запрашиваете ["3bbba47.pdf"] вместо [3bbba47.pdf]

0 голосов
/ 14 ноября 2009

От: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

Runtime.exec () не является командной строкой

Один последний подводный камень Runtime.exec () ошибочно предполагает что exec () принимает любую строку, которая ваша командная строка (или оболочка) принимает. Runtime.exec () гораздо более ограничен и не кроссплатформенный. Эта ловушка вызвано пользователями, пытающимися использовать метод exec () для принятия одного Строка в командной строке. путаница может быть связана с тем, что команда является именем параметра для метод exec (). Таким образом, программист неправильно связывает параметр командовать всем, что он или она можно ввести в командной строке, а не связывая это с одной программой и его аргументы.

...