Использование кавычек в getRuntime().exec
-
03-07-2019 - |
Вопрос
Я бы хотел вызвать 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"?
Решение
Используй это:
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 оболочка обрабатывает командную строку и восстанавливает знакомый массив строк, передаваемых в C's main.У тебя нет такой оболочки.Лучший подход (даже в Windows) - использовать форму exec, где вы передаете каждый аргумент командной строки по отдельности в его собственной строке.
Вы можете получить оболочку для синтаксического анализа для вас, если вы действительно этого хотите.Что сделало бы ваш пример похожим на (непроверенный):
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
EOF - это НЕ символ, поэтому написать EOF невозможно.Вы забыли закрыть строку, заключенную в кавычки.
Причиной этой ошибки, скорее всего, является отсутствующий синтаксический маркер, который ожидает bash, но передаваемая вами строка заканчивается до того, как bash с ней столкнулся.Ищите "если", "за" и т.д.которые не имеют завершающего значения fi или done.
Кавычки должны быть экранированы, когда они находятся внутри строки.Вместо того, чтобы писать "write \".
Например.
strcpy(c, "Это строка" в"кавычках");
на вашем месте я бы записал содержимое строки во временный bash-файл и посмотрел, выполняет ли bash это без каких-либо ошибок.Если это выполняется без ошибок, то я бы рассмотрел возможность дальнейшей отладки;