Инициализация двойной скобки создает анонимный класс, полученный из указанного класса (внешние фигурные скобки external ) и предоставляет блок инициализации внутри этого класса (скобки inner ). например,
new ArrayList<Integer>() {{
add(1);
add(2);
}};
Обратите внимание, что эффект от использования этой инициализации двойной скобки заключается в том, что вы создаете анонимные внутренние классы. Созданный класс имеет неявный указатель this
к окружающему внешнему классу. Хотя обычно это не проблема, это может вызвать горе в некоторых обстоятельствах, например. при сборке или сборе мусора, и это стоит знать об этом.
Используйте это:
Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});
Основной момент: не вставляйте двойные кавычки. Это только используется при записи командной строки в оболочке!
, например, echo "Hello, world!"
(как введено в оболочке) переводится в:
Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});
(Просто забывают в настоящий момент, что оболочка обычно имеет встроенное для echo
, и звонит /bin/echo
вместо этого.:-))
Командные строки Windows по-другому по сравнению с UNIX, Mac OS X и GNU/Linux.
В Windows процесс получает входной текст, как после executeable имени (и пространство). Тогда до программы для парсинга командной строки (обычно делается неявно и программист часто невежествен).
В GNU/Linux оболочка обрабатывает командную строку и gnereates, который знакомый массив строк передал основному C. У Вас нет той оболочки. Лучший подход (даже в Windows) должен использовать форму должностного лица, куда Вы передаете каждый параметр командной строки индивидуально в его собственной Строке.
можно получить оболочку к парсингу для Вас, если Вы действительно хотели. Который сделал бы Вас взглядом в качестве примера что-то как (непротестированный):
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});
EOF НЕ является символом, таким образом, нет никакого способа записать EOF. Вы забыли закрывать заключенную в кавычки строку.
Причина для этой ошибки наиболее вероятна недостающий маркер синтаксиса, который ожидает удар, но строка, Вы передаете концы перед ударом, встретилась с ним. Ищите IFS, четверки и т.д., которые не имеют никакого закрытия fi или сделанный.
Кавычек нужно оставить когда в строке. Вместо того, чтобы писать "запись \".
, Например,
strcpy (c, "Это - строка \"с \" кавычки");
на вашем месте я записал бы содержание строки к временному файлу bashfile и видел бы, выполняет ли удар это без какой-либо ошибки. Если бы это выполняется без ошибки, то я рассмотрел бы отладку далее;