Подтвердить что ты не робот

Использование котировок в 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"?

4b9b3361

Ответ 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 это без каких-либо ошибок. Если это выполняется без ошибки, я бы подумал о дальнейшей отладке;