Maison >Java >javaDidacticiel >Comment puis-je exécuter de manière fiable des commandes Shell avec le runtime Java ?

Comment puis-je exécuter de manière fiable des commandes Shell avec le runtime Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-06 05:43:10557parcourir

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

Manipulation du comportement du shell dans Java Runtime

Lors de l'utilisation de l'utilitaire Runtime.exec(String) de Java, des divergences peuvent survenir entre l'exécution de certaines commandes shell. Pour comprendre ces anomalies, nous devons nous plonger dans la mécanique des opérations des obus.

Comprendre les responsabilités des obus

Les obus effectuent des tâches cruciales qui soutiennent l'exécution des commandes, notamment :

  • Gestion des citations et des espaces : Les shells assurent une analyse précise des arguments, empêchant les espaces empêchent de séparer les chaînes comme "Mon fichier.txt."
  • Expansion globale : Les globules (*, ?) sont développés en noms de fichiers spécifiques avant l'exécution.
  • Gestion des redirections : Les shells gèrent les tuyaux (|) et les redirections (>) pour la sortie des commandes et input.
  • Extension des variables et des commandes : Les variables telles que $HOME peuvent être développées et des commandes telles que $(pwd) peuvent être exécutées et interpolées dans la chaîne de commande.

Causes des échecs d'exécution

Les commandes dépendantes du shell peuvent échouer lorsque invoqué via Runtime.exec(String) car :

  • Manque de fonctionnalité du shell : Runtime.exec(String) exécute des commandes sans invoquer de shell, ce qui signifie qu'il lui manque le traitement du shell capacités.

Solutions de contournement

Simple mais imparfait :

Utilisation de Runtime.exec(String[]) et passer la commande à un interpréteur shell permet une commande directe exécution :

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

Robuste et sécurisé :

Pour une sécurité et une robustesse accrues, gérez explicitement les responsabilités du shell à l'aide de 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();

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn