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