Использование кавычек в getRuntime(). Exec

Я хотел бы вызвать 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 ответов

Решение

Использовать этот:

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

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

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

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

(Просто забудьте на мгновение, что оболочка обычно имеет встроенный echoи зовет /bin/echo вместо.:-))

Командные строки 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;\""
});

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

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

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

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

Например

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

Другие вопросы по тегам