Я думаю, что проще заключать в кавычки строки, чем избегать их. Алгоритм одинарной кавычки:
- добавить символ открытия одной кавычки, чтобы открыть
- для каждого символа в исходной строке,
- если это одинарная кавычка, добавить одинарную кавычку, обратную косую черту, одинарную кавычку, одинарную кавычку (то есть закрыть кавычку, добавить экранированную одинарную кавычку, открыть цитату заново)
- иначе добавить сам символ
- добавить символ одинарной кавычки, чтобы закрыть
Так что это довольно легко.
Однако мне нравится ответ ProcessBuilder, который будет еще проще, если он у вас работает.
Полное исключение оболочки - это одновременно и производительность, и выигрыш в безопасности, если вам не нужны какие-либо функции оболочки и вы просто хотите запустить процесс.
Если вы хотите использовать экранирование, я бы предложил использовать белый список вместо символов черного списка. то есть избегать всего, что не является [a-zA-Z0-9_] или чего-то еще. Любой символ может быть экранирован, кроме новой строки. Обратная косая черта с последующим переводом строки означает «удалить как обратную косую черту, так и перевод строки» - если за пределами кавычек. В двойных кавычках, я думаю, вы можете избежать новой строки с обратной косой чертой, а затем новой строки. Внутри одинарных кавычек я не думаю, что вы должны (или можете) экранировать новую строку, просто добавьте символ новой строки.
Хорошим справочником является спецификация UNIX98 для "Shell Command Language" http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html