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から完全に機能します。

~このシェルスクリプトは、3人の異なるユーザーに対してわずかに異なる形式で存在するため、保持する必要があります。

4

3 に答える 3

14

1つのオプションは、~自分で処理することです。

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

もう1つは、Bashに処理させることです。

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

$HOMEすでに述べたように、チルダはシェル固有の拡張であり、現在のユーザーのホームディレクトリ(定義されている場合など)に置き換えることで手動で処理する必要があります。

すでに提供されているソリューションに加えて、ApacheCommonsプロジェクト のcommons-ioおよびcommons-execの使用を検討することもできます。

...
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

一般に、 System.getRuntime()。execの代わりにScriptEngineを使用することをお勧めします。これにより、作業
がより簡単になると思います。
このJDK6以降が必要であることを忘れないでください。
さらに、あなたの特定の問題に関して-私は本当にこの問題は構成可能であるべきだと思います。
次の操作を実行でき
ます。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 に答える