Использование кавычек в getRuntime (). Exec - PullRequest
22 голосов
/ 02 октября 2008

Я бы хотел вызвать bash, используя строку в качестве входных данных. Что-то вроде:

sh -l -c "./foo"

Я бы хотел сделать это с Java. К сожалению, когда я пытаюсь вызвать команду, используя getRuntime().exec, я получаю следующую ошибку:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

Кажется, это связано с тем, что моя строка не заканчивается EOF.

Есть ли способ вставить EOF для конкретной платформы в строку Java? Или я должен искать другой подход, например, писать во временный скрипт перед вызовом "sh"?

Ответы [ 6 ]

47 голосов
/ 02 октября 2008

Используйте это:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Основная мысль: не вводите двойные кавычки. Используется только при написании командной строки в оболочке!

Например, echo "Hello, world!" (как напечатано в оболочке) переводится на:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(На данный момент просто забудьте, что оболочка обычно имеет встроенную функцию для echo и вместо этого вызывает /bin/echo: -))

9 голосов
/ 02 октября 2008

Командные строки Windows отличаются от UNIX, Mac OS X и GNU / Linux.

В Windows процесс получает введенный текст как есть после исполняемого имени (и пробела). Затем программа должна проанализировать командную строку (что обычно делается неявно, а программист часто не имеет представления).

В GNU / Linux оболочка обрабатывает командную строку и собирает знакомый массив строк, передаваемых в main языка C. У тебя нет этой оболочки. Наилучший подход (даже в Windows) заключается в использовании формы exec, в которой каждый аргумент командной строки передается отдельно в отдельной строке.

Вы можете получить оболочку для анализа, если вы действительно этого хотите. Что заставило бы ваш пример выглядеть примерно так (не проверено):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
4 голосов
/ 02 октября 2008

EOF НЕ является символом, поэтому невозможно написать EOF. Вы забыли закрыть строку в кавычках.

0 голосов
/ 02 октября 2008

на вашем месте я бы записал содержимое строки во временный bash-файл и посмотрел, выполняет ли bash это безо всякой ошибки. Если это выполняется без ошибок, то я хотел бы рассмотреть дальнейшую отладку;

0 голосов
/ 02 октября 2008

Кавычки необходимо экранировать, когда они внутри строки. Вместо написания "напиши \".

* 1003 Е.Г. *

strcpy (c, "Это строка \" с \ "кавычками");

0 голосов
/ 02 октября 2008

Причиной этой ошибки, скорее всего, является отсутствие синтаксического токена, который ожидает bash, но передаваемая вами строка заканчивается до того, как bash встретил ее. Ищите ifs, fors и т. Д., У которых нет закрывающих фи или готово.

...