Построитель процессов Java получает команду сборки

Мне нужно запустить процесс в новом окне консоли. Для компьютеров Mac я нашел нечто подобное: Запуск команда в новом окне терминала Mac OS X, где команда для запуска передается в виде строки.

Поэтому я сделал метод, который по списку строк (например, построитель процессов) возвращает список строк (последняя команда), которая запустит данную команду в новом окне консоли. Я мог бы добавить к заданным строкам пробелы, что в большинстве случаев будет работать, но как мне правильно избежать этого? Например, я могу передать построитель процессов new String[] { "echo", "hello world" }, а он на самом деле делает echo "hello world". И это касается и многих других случаев (я думаю).

Я думаю, что объяснение сложное, поэтому вот псевдо-заглушка:

public static String[] getConsoleCommand(String[] command) {
    if operating system is Mac...
        String commandString = concatenate command...
        return new String[] { "osascript", "-e",
            String.format("'tell application \"Terminal\" to do script \"%s\"'",
                        commandString.replace("'", "\\\'")) // escape single quote used in 'tell application...'
        };
}

person Raekye    schedule 30.03.2013    source источник


Ответы (1)


person    schedule
comment
Я не думаю, что это касается консольных команд. Например, если в качестве одного из параметров передается Hello world, мне нужно, чтобы он также экранировал пробел как Hello\ world - person Raekye; 30.03.2013
comment
Я не понимаю, зачем тебе нужно пространство для побега. когда мы говорим об экранировании, обычно это относится к тем символам, которые могут запутать компилятор/парсер. В вашем случае, почему ProcessBuilder не может соответствовать вашим требованиям? Или, если ваша команда такая сложная, почему бы не поместить все в скрипт и просто запустить этот скрипт (может быть с минимальными параметрами) - person user650749; 31.03.2013
comment
Команда, которую я создаю, зависит от пользовательского ввода. Пространство было просто примером - по сути, я не эксперт по оболочкам и не уверен в каких-либо других случаях, которые мне нужно было бы обрабатывать. Если вы скажете, что все, о чем мне нужно беспокоиться, это токены с пробелами, которые нужно помещать в кавычки и экранировать их кавычки, тогда это подойдет. Не уверен, что я понимаю - что более ясно? - person Raekye; 01.04.2013
comment
Не рекомендуется запускать любой ввод пользователя в качестве команды в оболочке. Это будет иметь риск внедрения, из-за которого пользователь может запустить любую команду, такую ​​​​как rm -f *. ProcessBulider – это то, что вам нужно. в вашем случае вам может не понадобиться писать очень причудливый сценарий оболочки. Вы можете записать ввод в файл и получить команду для обработки этого файла. Таким образом, вы можете обрабатывать пользовательский ввод контролируемым образом. - person user650749; 03.04.2013
comment
Он работает на их собственном компьютере, в режиме «делай, что хочешь». Так что мне все равно, попытаются ли они удалить все свои файлы :P - person Raekye; 03.04.2013