Выполнение shell-скрипта с параметрами из java
Я некоторое время гуглил, и у всех, похоже, есть другое решение, ни одно из которых, похоже, не работает для меня.
Я пробовал оба ProcessBuilder и Runtime. Оба называют .sh файл непосредственно и подачи его в /bin/bash. Безрезультатно.
вернемся к основам, мой текущий код выглядит следующим образом;
String cmd[] = { "~/path/to/shellscript.sh", "foo", "bar" };
Process p = Runtime.getRuntime().exec(cmd);
что это No such file or directory ошибка, несмотря на то, что выполняется вручную;
~/path/to/shellscript.sh foo bar
отлично работает с удар.
мне нужно сохранить ~ потому что этот shellscript существует в несколько разных формах для трех разных пользователей.
3 ответов
один из вариантов-ручка ~ сам себе:
String homeDir = System.getenv("HOME");
String[] cmd = { homeDir + "/path/to/shellscript.sh", "foo", "bar" };
Process p = Runtime.getRuntime().exec(cmd);
другой, чтобы позволить Баш обрабатывать его для вас:
String[] cmd = { "bash", "-c", "~/path/to/shellscript.sh foo bar" };
Process p = Runtime.getRuntime().exec(cmd);
Как уже упоминалось, Тильда-это расширение оболочки, которое должно обрабатываться вручную, заменяя его домашним каталогом текущего пользователя (e.g с $HOME если он определен).
помимо уже данных решений, вы также можете использовать commons-io и commons-exec С Apache Commons:
...
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor;
import org.apache.commons.io.FileUtils;
...
CommandLine cmd = new CommandLine("path/to/shellscript.sh");
cmd.addArgument("foo");
cmd.addArgument("bar");
Executor exec = new DefaultExecutor();
exec.setWorkingDirectory(FileUtils.getUserDirectory());
exec.execute(cmd);
...
В общем, я бы рекомендовал вам использовать ScriptEngine вместо системы.getRuntime().exec 
Я думаю, это облегчит тебе жизнь. 
Имейте в виду, что вам нужно для этого JDK 6 и выше. 
Кроме того, что касается вашей конкретной проблемы - я действительно думаю, что эта проблема должна быть настраиваемой. 
Вы можете сделать следующее: 
А. имеют в своем .bash_rc или .файл (для каждого пользователя) указать путь к конфигурации 
сценарий использование:
ЭКСПОРТ MY_SCRIPT= 
B. прочитайте это значение из кода java, используя String sciprtPath  = System.getenv("MY_SCRIPT") чтобы получить значение. 
C. запустите сценарий, как вы сделали в своем коде, с переменной scriptPath или с помощью scriptEngine.
