Я хотел бы вызвать 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»?
Какой код Java вы использовали для вызова bash? Строки, которые вы используете в этом Java-коде, кажутся неправильными. К сожалению, они отсутствуют в сообщении, что делает его не особенно полезным ...




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