ホームページ >Java >&#&チュートリアル >Java ランタイムでシェル コマンドを確実に実行するにはどうすればよいですか?

Java ランタイムでシェル コマンドを確実に実行するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-06 05:43:10557ブラウズ

How Can I Reliably Execute Shell Commands with Java's Runtime?

Java ランタイムでのシェルの動作の操作

Java の Runtime.exec(String) ユーティリティを使用する場合、特定のシェル コマンドの実行間に不一致が発生する可能性があります。これらの異常を理解するには、シェル操作の仕組みを詳しく調べる必要があります。

シェルの責任を理解する

シェルは、コマンドの実行をサポートする次のような重要なタスクを実行します。

  • 引用符とスペースの処理:シェルは引数の正確な解析を保証し、「My File.txt」のような文字列がスペースによって分解されるのを防ぎます。
  • グロブ展開: グロブ (*, ?) は実行前に特定のファイル名に展開されます。
  • リダイレクト管理: シェルはパイプ (|) とリダイレクトを管理します(>) コマンドの出力と入力。
  • 変数とコマンドの展開: $HOME などの変数は展開でき、$(pwd) などのコマンドは実行してコマンドに挿入できます。 string.

実行の原因失敗

シェルに依存するコマンドは、Runtime.exec(String) を介して呼び出すと失敗する可能性があります。理由は次のとおりです。

  • シェル機能の欠如: Runtime.exec (文字列) はシェルを呼び出さずにコマンドを実行します。つまり、シェルの処理がありません。機能。

回避策

単純だが不完全:

Runtime.exec(String[]) とコマンドをシェルインタープリタに渡すことで、直接コマンドを実行できるようになります。実行:

String myFile = "some filename.txt";
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();

以上がJava ランタイムでシェル コマンドを確実に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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