Одна вещь, которую я отмечаю о вашей конструкции, это то, что вы, возможно, неправильно строите командную строку.Читая документы ProcessBuilder (ранее они не использовались), вы строите команду процесса со списком строк, как вы это делаете, но первая строка - это команда, остальные - аргументы.Способ создания команды:
List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh " + "my_script.sh");
ProcessBuilder builder = new ProcessBuilder(command);
появляется для создания имени команды, которое включает имя сценария.Измените вызов на:
List<String> command = new ArrayList<String>();
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh ");
command.add("my_script.sh");
ProcessBuilder builder = new ProcessBuilder(command);
и проверьте ошибку.Затем проверьте, не обнаружена ли проблема, связанная с тем, что c: \ cygwin \ bin \ sh.exe не найден или сам скрипт не найден.Вы упоминаете, что пытались безуспешно выполнить cd , так где же находится сценарий my_script.sh относительно файлов классов java?Когда вы вызываете команду sh , возможно, не удастся найти файл my_script.sh , поскольку рабочий каталог может оказаться не там, где вы думаете.
Oneвы можете попытаться определить, где sh.exe считает, что он работает.Из вашего Java-кода вы сможете вызывать оболочку следующим образом:
List<String> command = new ArrayList<String>();
String fs = System.getProperty("file.separator");
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
command.add("-c");
command.add("pwd");
Вывод этого должен быть каталогом, из которого команда оболочки считает, что она выполняется.Если это не то место, где находится фактический my_script.sh , вам может потребоваться полный путь к самому сценарию (в качестве примера пути в формате cygwin)
command.add(System.getenv("cygwin") + fs + "bin" + fs + "sh");
command.add("/usr/local/scripts/my_script.sh");
Этоэто то место, где я бы начал отлаживать.