Выполнение 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.