ホームページ >Java >&#&チュートリアル >「Runtime.exec(String)」が時々コマンドを正しく実行できないのはなぜですか?

「Runtime.exec(String)」が時々コマンドを正しく実行できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 22:22:10456ブラウズ

Why Does `Runtime.exec(String)` Sometimes Fail to Execute Commands Correctly?

特定のコマンドで Runtime.exec(String) の動作が異なるのはなぜですか?

Runtime.exec(String) では、次のコマンドを実行できます。基礎となるオペレーティング システムの環境。ただし、一部のコマンドではシームレスに機能しますが、他のコマンドでは問題が発生します。

なぜ違いますか?

主な違いは、コマンドが実行されないという事実に起因します。シェル環境で。シェルは、Runtime.exec(String) によって実行されない重要なサービスを提供するため、エラーが発生します。

いつ失敗が発生しますか?

コマンドが依存している場合、コマンドは失敗します。次のようなシェル機能:

  • 引用符の正しい分割とスペース: Runtime.exec(String) は単純にスペースで分割します。これにより、「My File.txt」のような引数が個別のファイル名に分割される可能性があります。
  • グロブとワイルドカードの展開:シェルは *.doc のようなパターンを実際のファイルに書き換えます。 Runtime.exec(String) はこの展開を実行しません。
  • パイプとリダイレクトの処理: シェルは、Runtime.exec(String) が処理しない出力リダイレクトを設定します。
  • 変数とコマンドの展開: シェルは、シェル変数とコマンドを実行する前に置き換えます。 指示。 Runtime.exec(String) はそれらを文字通り渡します。

解決策

この状況を処理するには 2 つのアプローチがあります:

シェルへの委任 (単純ですが、ずさんな):

コマンドをシェルに渡す (例: Runtime.exec(String[]) を使用する):

String myCommand = "cp -R '" + myFile + "' $HOME 2> errorlog";
Runtime.getRuntime().exec(new String[] { "bash", "-c", myCommand });

シェルの責任を引き受ける (安全で安全な堅牢):

を使用変数展開、リダイレクト、単語分割などのシェルのようなタスクを処理する ProcessBuilder:

String myFile = "some filename.txt";
ProcessBuilder builder = new ProcessBuilder(
    "cp", "-R", myFile,
    System.getenv("HOME")
);
builder.redirectError(ProcessBuilder.Redirect.to(new File("errorlog")));
builder.start();

以上が「Runtime.exec(String)」が時々コマンドを正しく実行できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。