Использование кавычек в 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»?

Вы получаете ошибку во время компиляции или во время выполнения?

Vincent Ramdhanie 25.10.2008 06:49

Какой код Java вы использовали для вызова bash? Строки, которые вы используете в этом Java-коде, кажутся неправильными. К сожалению, они отсутствуют в сообщении, что делает его не особенно полезным ...

oberlies 07.08.2013 12:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
24
2
19 525
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

EOF НЕ является символом, поэтому нет возможности написать EOF. Вы забыли закрыть строку в кавычках.

Причиной этой ошибки, скорее всего, является отсутствующий токен синтаксиса, который ожидает bash, но строка, которую вы передаете, заканчивается до того, как bash обнаружил ее. Ищите if, for и т. д., Которые не завершаются или не завершаются.

Ответ принят как подходящий

Использовать это:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Основной момент: не заключайте двойные кавычки. Это используется только при написании командной строки в оболочке!

например, echo "Hello, world!" (введенный в оболочке) переводится в:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(Просто забудьте на мгновение, что оболочка обычно имеет встроенную функцию для echo и вместо этого вызывает /bin/echo. :-))

Внутри строки кавычки нужно экранировать. Вместо того, чтобы писать «пиши \».

Например.

strcpy (c, "Это строка \" с \ "кавычками");

Командные строки Windows ведут себя иначе, чем UNIX, Mac OS X и GNU / Linux.

В Windows процесс получает вводимый текст дословно после имени исполняемого файла (и пробела). Затем программа должна проанализировать командную строку (что обычно делается неявно, программист часто не имеет представления о процессе).

В GNU / Linux оболочка обрабатывает командную строку, гарантируя передачу знакомого массива строк функции main языка C. У тебя нет этой оболочки. Лучший подход (даже в Windows) - используйте одну из форм exec, где вы передаете каждый аргумент командной строки индивидуально в своем собственном String.

Process exec​(String[] cmdarray)    
Process exec​(String[] cmdarray, String[] envp)     
Process exec​(String[] cmdarray, String[] envp, File dir)

Или лучше java.lang.ProcessBuilder.

Вы можете получить оболочку, которая будет выполнять синтаксический анализ за вас, если действительно хотите. Это заставит ваш пример выглядеть примерно так (непроверенный):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

на вашем месте я бы записал содержимое строки во временный файл bash и посмотрел, выполнит ли bash это без каких-либо ошибок. Если это выполняется без ошибок, я бы рассмотрел возможность дальнейшей отладки;

Другие вопросы по теме