Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top