10

我已经在谷歌上搜索了一段时间,每个人似乎都有不同的解决方案,但似乎没有一个对我有用。

我都试过了ProcessBuilderRuntime。直接调用.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

从 bash 完美运行。

我需要保留,~因为对于三个不同的用户,这个 shellscript 以稍微不同的形式存在。

4

3 回答 3

14

一种选择是处理~自己:

String homeDir = System.getenv("HOME");
String[] cmd = { homeDir + "/path/to/shellscript.sh", "foo", "bar" };
Process p = Runtime.getRuntime().exec(cmd);

另一个是让 Bash 为您处理它:

String[] cmd = { "bash", "-c", "~/path/to/shellscript.sh foo bar" };
Process p = Runtime.getRuntime().exec(cmd);
于 2012-11-01T18:20:37.107 回答
3

As already mentioned, tilde is a shell-specific expansion which should be handled manually by replacing it with the home directory of the current user (e.g with $HOME if defined).

Besides the solutions already given, you might also consider using commons-io and commons-exec from the Apache Commons project:

...
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);
...
于 2012-11-01T21:17:55.403 回答
1

一般来说,我建议您使用ScriptEngine而不是 System.getRuntime().exec
我认为这会让您的事情变得更容易。
请记住,您需要此 JDK 6 及更高版本。
此外,关于您的具体问题 - 我真的认为这个问题应该是可配置的。
您可以执行以下操作:
A. 在您的 .bash_rc 或 .bash_profile(对于每个用户)中使用以下命令定义配置
脚本的路径:
EXPORT MY_SCRIPT=


B. 从 java 代码中读取此值,
String sciprtPath = System.getenv("MY_SCRIPT")用于获取该值。
C. 使用 scriptPath 变量或使用 scriptEngine 运行脚本,就像您在代码中所做的那样。

于 2012-11-01T18:19:23.777 回答