0

Javaで複数のシェルコマンドを実行しようとしています。これが私のコードです:

Process send = Runtime.getRuntime().exec(new String[] {"javac /tmp/"+ fileName + ";" + "sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + ";" + "java /tmp/"+ fileNameShort + ".class;"}); 

ファイルが正確に tmp フォルダーの下にあることは知っていますが、どれも正常に動作しません。

ファイル名: "Foo.java" fileNameShort: "Foo"

4

4 に答える 4

1

いいえ、この方法ではできません:

指定された文字列コマンドを別のプロセスで実行します。

シェル スクリプトを作成し、そのスクリプトを呼び出すことをお勧めします。

Process pr = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "/path/script.sh"});
于 2013-11-12T10:52:14.893 に答える
1

3 つのコマンドを連続して実行しています。各コマンドは個別のProcess. また、コマンドとパラメーターは配列の要素に分割する必要があります。

Process send1 = Runtime.getRuntime().exec(new String[] {"javac", "/tmp/"+ fileName});
send1.waitFor();  // this returns an int with the exit status of the command - you really should check this!
Process send2 = Runtime.getRuntime().exec(new String[] {"sed", "-i", "s/Foo/Foo2/g", "/tmp/"+ fileName});
send2.waitFor();
Process send3 = Runtime.getRuntime().exec(new String[] {"java", "/tmp/"+ fileNameShort+".class"});
send3.waitFor();

または、すべてをフィードしsh -cます(ただし、引数のエスケープなどについて心配する必要がないため、実際には前の方法を使用する必要があります)。

Process send = Runtime.getRuntime().exec(new String[] {"sh", "-c", "javac /tmp/"+ fileName + "; sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + "; java /tmp/"+ fileNameShort + ".class"}); 
于 2013-11-12T10:53:42.720 に答える
0
Runtime.getRuntime().exec

あなたのコマンドラインではありません - 同時にいくつかのコマンドを処理することはできません、リダイレクトを使用することはできません...

于 2013-11-12T10:50:17.903 に答える
0

実行しているように 3 つのコマンドを続けて実行できますが、実行するにはそれらを bash (または別のシェル) に渡す必要があります。他の人が指摘したように、exec() 呼び出しごとに 1 つの OS プロセスしか開始できません。したがって、このプロセスを bash にして、必要なプロセスを実行する手段を提供します。または、別のユーザーが指摘したように、単に 3 つのプロセスを開始します。

次に、問題はbashの問題になります。

たとえば、次のようになります。

echo -e "echo 'AAA'; for x in 1 2 3; do echo 'BBB'; done; echo 'CCC'" | bash

印刷します

AAA
BBB
BBB
BBB
CCC

これらは実際には、単一の exec() ですべてを実行できる 3 つのプロセスです。

さて、あなたが実際に解決しようとしている問題についてですが、バイトコードを変更したいようです。そのためにライブラリを使用することをお勧めします。ASM をご覧ください: http://asm.ow2.org/

于 2013-11-12T11:01:40.187 に答える