0

StringBuilder を使用して文字列を作成し、Linux 端末で文字列を実行しようとしています。ただし、コマンド全体を実行する代わりに、半分のコマンドを実行してから終了します。これは私のJavaコードスニペットです:

moteCommand.append("CFLAGS+=-DCC2420_DEF_CHANNEL=1");
moteCommand.append(" ");
moteCommand.append("make telosb install.");
moteCommand.append(moteIdList.get(i).toString());
moteCommand.append(" bsl,");
moteCommand.append(moteAddrList.get(i).toString());
String moteCommand2 = moteCommand.toString();
Process moteProgProcess = Runtime.getRuntime().exec(moteCommand2, null,"/opt/tinyos-2.x/apps/XXX/);

次のエラーが表示されます: プログラム "CFLAGS+=-DCC2420_DEF_CHANNEL=1" を実行できません (ディレクトリ "/opt/tinyos-2.x/apps/xxx" 内): java.io.IOException: error=2, No such file orディレクトリ

システム プロセスが文字列の半分だけを実行しようとする理由がわかりません。理由を知っている人がいたら教えてください。

ありがとう。

4

1 に答える 1

3

を呼び出す場合Runtime.exec()、最初のスペースまでの文字は、起動するプログラムの名前でなければなりません。その後、スペース間の各「部分」は個別の引数になります。呼び出しRuntime.exec()は、bash (または他のシェル...) でコマンドを入力して Enter キーを押すのとはまったく異なることに注意してください!! bash で正常に動作するコマンドを入力しても、それが で動作するとは限りませんRuntime.exec()。たとえば、(外部プログラムではない) シェル コマンドは では機能しませんRuntime.exec()

あなたがすべきことは使用することProcessBuilderです。

Mapそれをインスタンス化し、環境オプション (つまり、cflags など、コマンド名のに渡すもの、およびその他の必要なもの) を表すそれを操作し、コマンド名を設定し、一度に 1 つずつ引数を与えます (引数はスペースで分割されないため、たとえば、スペースを含むパスを渡すことができます) など。 stdin、stdout、および stderr をさまざまな方法で操作できます (Java プロセスで使用されるものと同じものを使用するなど)。 ; または InputStream と OutputStream のインスタンスを取得してプロセスに書き込み、プロセスから読み取ります; またはそれらをパイプします)、プロセスを実行します。

線に沿った何か:

final ProcessBuilder pb = new ProcessBuilder("make", "telosb", "install" blablablabla);
final Map<String, String> env = pb.environment();
env.put("CFLAGS", "....your options....");
pb.start(); // take the Process instance, and you will be able to read the output, wait for it to finish, get the exit code, etc 
于 2013-02-27T04:48:47.337 に答える