Командные строки Windows отличаются от UNIX, Mac OS X и GNU / Linux.
В Windows процесс получает введенный текст как есть после исполняемого имени (и пробела). Затем программа должна проанализировать командную строку (что обычно делается неявно, а программист часто не имеет представления).
В GNU / Linux оболочка обрабатывает командную строку и собирает знакомый массив строк, передаваемых в main языка C. У тебя нет этой оболочки. Наилучший подход (даже в Windows) заключается в использовании формы exec, в которой каждый аргумент командной строки передается отдельно в отдельной строке.
Вы можете получить оболочку для анализа, если вы действительно этого хотите. Что заставило бы ваш пример выглядеть примерно так (не проверено):
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});