質問

コマンドを実行するコードがいくつかありました Runtime.getRuntime.exec(文字列), 、Windowsでも動作しました。コードを Linux に移動すると壊れてしまい、それを修正する唯一の方法は、 exec(文字列[]) バージョン。このままにした場合、コードは Windows と Linux で同じように機能しますか、それとも Windows では exec(String) を使用し、Linux では exec(String[]) を使用する必要がありますか?

役に立ちましたか?

解決

使用 弦[] 両方に。

答えは私 前にあなたにくれた これは、Windows 上で動作する製品ソフトウェアをデバッグする悲惨な数時間の結果でした。

多くの努力の結果、私たち(私)は前に投稿した解決策にたどり着きました(使用 弦[] )

あなたが抱えている問題はLinux上にあったので、両方で配列を使用するのが最善だと思います。

ところで。私はそのメソッドを Java 1.4 で試しました。それ以来、新しいクラスが利用可能になりました。 プロセスビルダー Java1.5で追加されました。それが一体何なのかは分かりませんが、それにはそれなりの理由があるはずです。これを見て、Runtime.exec との違いを読んでください。おそらくそれはより良い選択肢になるでしょう。

最後に、一部のコマンドはシェル (Windows cmd または bash/sh/ など) に組み込まれているため、どちらのプラットフォームでも機能しません。 ディレクトリ または エコー そしてそれらのいくつか。したがって、各ターゲットプラットフォームで追加のテストを実行し、サポートされていないコマンドの例外ハンドラーを追加することをお勧めします。

:)

他のヒント

さて、私はあきらめ:非自明などのコマンドあなたは)(EXECに渡すと、WindowsとLinuxの両方で、合理的な結果を得ることを期待できますか? )(EXECかどうかを尋ねることは、プラットフォーム固有の動作を起動するEXECの全体のポイントを()、欠落しているように見えるのプラットフォームに依存しないようなものである。

実際にあなたの質問に対処するために、はい - コマンド文字列が解釈される方法は、(Linux上で、異なるシェルの、および潜在的に)異なるプラットフォーム上で異なること、およびString []型のバージョンを使用して終わる可能性が高くなりますパラメータが正しく渡さ取得します。

exec(String) パラメータを String[] に分割するためのデフォルトの Tokeniser は、単純にスペース文字でパラメータを分割します。手動で入力したシェル コマンドのように引用符を解釈しないため、String[] バージョンを呼び出す必要があります。ただし、両方のプラットフォームで Sun JDK を使用している場合、動作は同様になるはずです。

ただし、Windows は他のオペレーティング システムと異なるシェル コマンド (たとえば、cp の代わりに copy) を提供するため、コマンドがすべてのプラットフォームで機能するとは限りません。

単一の文字列を取るのexec()メソッド、および配列を受け取り1との違いは、配列バージョンを使用すると、コマンドとその引数を分割する必要がある方法を指定できるようにするということである(すなわち。正しく) 。 あなたは、メソッドが空白の配列にそれを壊すだけの文字列を受け入れる方法(複数可)を使用する場合。それ以降の処理が両方の方法で同じに扱われます。

これは、配列に単一の文字列を切断して処理を継続する文字列[]バージョンを呼び出す方法を示しランタイムクラスからのコードである。

   public Process exec(String command, String[] envp, File dir)
            throws IOException {
         if (command.length() == 0)
             throw new IllegalArgumentException("Empty command");

         StringTokenizer st = new StringTokenizer(command);
         String[] cmdarray = new String[st.countTokens()];
         for (int i = 0; st.hasMoreTokens(); i++)
             cmdarray[i] = st.nextToken();
         return exec(cmdarray, envp, dir);
     }
whitspace上でコマンドを破壊することは正しく、別のコマンドと引数いない場合は、

ように文字列を受け入れる方法は動作しません。

[API] より[1]

この方法では、CMDARRAYが有効なオペレーティングシステムコマンドであることを確認します。どのコマンドが有効であるかはシステム依存ですが、少なくともコマンドは非ヌル文字列の空ではないリストでなければなりません。

はい、それはシステムに依存します。ところで、(最終的に) 何が間違っているかを確認できるように、関連するコードを投稿していただけますか?

[1]: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String[], 、java.lang.String[]、java.io.File)

のexec()は、基礎となるオペレーティングシステムのネイティブコマンドを起動します。

Windows用に設計されたコマンドは、Linux上で動作しません、と書き直さなければならないでしょう。

は、WindowsおよびLinux上で異なるコマンドを実行したい場合は、OSには、次のようなものを使用することによって実行されているかを調べることができます:

        String os = System.getProperty("os.name").toLowerCase();
        if (os.indexOf("win") >= 0) {
            // Windows Commands
        } else {
            // Linux Commands
        }

もう一つの良いことは、スクリプト(Windows用の.batやLinux用.SH)であなたしているコマンドを記述し、代わりにこれらのスクリプトを呼び出すことになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top