Использование кавычек в 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, "Это строка \" с \ "кавычками");