0

Mac ターミナルでいくつかの外部コマンドを実行するために、いくつかの Java コードを作成します。ターミナルで実行する元のコマンドは

xpl-sender -c plugwise.basic -m xpl-cmnd command=livepower device=B83229 -w 3

コマンド文字列配列を使用すると、次のようになるため、本当に奇妙です。

Process ls = Runtime.getRuntime().exec(new String[]{
   "/usr/local/bin/xpl-sender",
   "-c", "plugwise.basic",
   "-m", "xpl-cmnd",
   "command=" + command,
   "device=" + id});

「-w 3」がなければ正常に動作しますが、もちろんパラメータが不足しています。

しかし、私がこのように使用すると

Process ls = Runtime.getRuntime().exec(new String[]{
   "/usr/local/bin/xpl-sender",
   "-c", "plugwise.basic",
   "-m", "xpl-cmnd",
   "command=" + command,
   "device=" + id,
   "-w 3"});

最後に「-w 3」を付けると何も動かなくなり、コマンドが実行されていないように見えます。

そして、私がこのように使用すると

Process ls = Runtime.getRuntime().exec(new String[]{
   "/usr/local/bin/xpl-sender",
   "-c", "plugwise.basic",
   "-m", "xpl-cmnd",
   "command=" + command,
   "device=" + id + " -w 3"});

最後に +" -w 3" を付けると、コマンドの実行に使用された perl プログラムが戻ります。

Illegal hexadecimal digit '-' ignored at /Library/Perl/5.12/xPL/Dock/Plugwise.pm line 964.

-w と 3 の間のスペースが原因でエラーが発生したよう
です。
どうもありがとうございました。

4

2 に答える 2

1

"-w"ランタイムが引数を解釈する方法により、文字列をと"3"ではなくに分割する必要があります"-w 3"。スペースを含む引数を指定する場合があるため、設計者はこの動作を実装することを選択しました。例えば:

grep -r -e "彼らは今どこにいる" .

上記の例では、開発者が文字列 "Where are they now" を手動でエスケープしなければならないようにするのではなく、ランタイムは文字列全体を引数として単純に渡すことを許可し、それを基になるプロセスに渡します。ただし、次のような場合は次のようになります。

ls -al ~

各引数を個別にランタイムに渡す必要があること。上記の例で、"ls -al" として 1 つの引数を渡した場合、実際には基になるプロセスに1 つの文字列として渡されます。もちろん、その名前の既存のバイナリがないため、プロセスは失敗します。

于 2013-03-23T21:50:24.560 に答える
1

あなたはシェルコマンドと同等のことをしています

xpl-sender ... '-w 3'   # One 4-char arg

それ以外の

xpl-sender ... -w 3     # Two args

あなたがしたい:

Process ls = Runtime.getRuntime().exec(new String[]{
   "/usr/local/bin/xpl-sender",
   "-c", "plugwise.basic",
   "-m", "xpl-cmnd",
   "command=" + command,
   "device=" + id,
   "-w", "3"});

ほとんどのプログラムは、非オプションの後にオプションを受け入れないため (あなたはそれがあなたの で動作すると報告していますがxml-sender)、見た目が良いので、上に移動-wします。

Process ls = Runtime.getRuntime().exec(new String[]{
   "/usr/local/bin/xpl-sender",
   "-c", "plugwise.basic",
   "-m", "xpl-cmnd",
   "-w", "3",
   "command=" + command,
   "device=" + id});
于 2013-03-23T21:51:05.480 に答える