Использование котировок в 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? Или я должен искать другой подход, например писать в temp script перед вызовом "sh"?
Ответы
Ответ 1
Используйте это:
Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});
Основная точка: не помещайте двойные кавычки. Это используется только при написании командной строки в оболочке!
например, echo "Hello, world!"
(как указано в оболочке) переводится на:
Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});
(Запомните на тот момент, что оболочка обычно имеет встроенную функцию для echo
и вместо этого вызывает /bin/echo
.: -))
Ответ 2
Командные строки Windows отличаются от UNIX, Mac OS X и GNU/Linux.
В Windows процесс получает входной текст как есть после имени исполняемого файла (и пробела). Затем он переходит к программе для синтаксического анализа командной строки (которая обычно выполняется неявно, а программист часто незначителен).
В GNU/Linux оболочка обрабатывает командную строку и выдает знакомый массив строк, переданных в C main. У вас нет этой оболочки. Лучшим подходом (даже в Windows) является использование формы exec, где вы передаете каждый аргумент командной строки в отдельной строке.
Вы можете получить оболочку для разбора, если хотите. Который сделал бы ваш пример похожим на (непроверенным):
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
Ответ 3
EOF НЕ является символом, поэтому нет возможности писать EOF.
Вы забыли закрыть строку с кавычками.
Ответ 4
Причиной этой ошибки является, скорее всего, отсутствующий токен синтаксиса, который ожидает bash, но строка, которую вы передаете, заканчивается до того, как bash столкнулся с ней. Ищите ifs, fors и т.д., Которые не имеют закрытия или сделаны.
Ответ 5
Котировки должны быть экранированы внутри строки.
Вместо того, чтобы писать "писать".
например.
strcpy (c, "Это строка \" с\ "кавычками" );
Ответ 6
Если бы я был вами, я бы написал содержимое строки в temp bashfile и посмотрел, выполняет ли bash это без каких-либо ошибок. Если это выполняется без ошибки, я бы подумал о дальнейшей отладке;