Лучший способ динамически создавать и выполнять команду bash в java?

У меня есть Java-бот, над которым я работаю, который принимает данные от пользователя через сообщение IRC. Пользователь вводит что-то вроде .host file=foo file=bar hostname="this is a name", и он запускает для них сервер на основе их ввода.

Прямо сейчас у меня есть метод, который в основном анализирует их сообщение, ищет hostname="" (должен быть заключен в кавычки), разбивает часть hostname= и устанавливает имя хоста в соответствии с их результатом (например, hostname="this is имя" станет -hostname "это имя"). Я использую регулярное выражение для этого.

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

./server -hostname "это имя"

Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку я разделяю пробелами, если пользователь добавляет тире в имя хоста (например, hostname="this is - a name", он будет думать, что тире относится к аргументу , а остальное в основном отрубит.

Дальнейшее объяснение: ProcessBuilder будет разделен пробелами, поэтому он будет передавать «-hostname», «this», «is», «-», «a», «name». Здесь у меня проблемы, так как - означает, что я должен передавать аргумент, но я его использую не для этого.

Каков был бы наиболее эффективный способ реализовать это, чтобы любой передаваемый символ был только буквально этим символом? Должен ли я не разделяться на пробелы? Если я запускаю ./server -hostname "это - имя" из оболочки Linux, все будет работать нормально.

Я ценю любую помощь. Спасибо!


person Tyrone Whiteral    schedule 12.10.2012    source источник
comment
Проект, который пытается сделать Runtime.exec менее болезненным. Не уверен, что это лучший способ, но чтение исходного кода дает вам хорошее представление о том, как взаимодействовать с Runtime.exec: github.com/RasmanTuta/exec-utils/tree/master/exec-utils/src/   -  person ebaxt    schedule 13.10.2012
comment
Практически дубликат: stackoverflow.com/questions/4916918/   -  person noahlz    schedule 13.10.2012
comment
Я думаю, они довольно разные. Я уже разбиваю строку на массив по предложению Микеля. У меня проблема в том, что, поскольку команда является динамической, проверка того, что - не интерпретируется как попытка передать аргумент, а скорее буквальный символ «-».   -  person Tyrone Whiteral    schedule 13.10.2012


Ответы (2)


И Runtime.exec, и ProcessBuilder будут принимать список команд.

Runtime.exec(new String[]{"./server", "-hostname", "this is - a name"};
ProcessBuilder pb = new ProcessBuilder("./server", "-hostname", "this is - a name");

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

person MadProgrammer    schedule 12.10.2012

Я решил полностью изменить свой код и использовать регулярное выражение для анализа ввода от пользователя вместо предыдущего метода и разделения по пробелам. Это означает, что я могу просто добавить ввод в Arraylist как полный «+sv_hostname="test - name"» вместо «+sv_hostname», «test», «-», «name».

person Tyrone Whiteral    schedule 13.10.2012