Maison >Java >javaDidacticiel >Pourquoi « Runtime.exec(String) » ne parvient-il parfois pas à exécuter correctement les commandes ?

Pourquoi « Runtime.exec(String) » ne parvient-il parfois pas à exécuter correctement les commandes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 22:22:10464parcourir

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

Pourquoi Runtime.exec(String) se comporte-t-il différemment pour certaines commandes ?

Runtime.exec(String) permet l'exécution de commandes dans l’environnement du système d’exploitation sous-jacent. Cependant, même si cela fonctionne parfaitement pour certaines commandes, des problèmes surviennent avec d'autres.

Pourquoi la différence ?

La principale différence vient du fait que les commandes ne sont pas exécutées. dans un environnement shell. Le shell fournit des services essentiels qui ne sont pas exécutés par Runtime.exec(String), ce qui entraîne des erreurs.

Quand l'échec se produit-il ?

Les commandes échouent lorsqu'elles dépendent sur les fonctionnalités du shell, telles que :

  • Partage correct des guillemets et des espaces : Runtime.exec(String) se divise naïvement en espaces, ce qui peut diviser des arguments tels que "Mon fichier.txt" en noms de fichiers séparés.
  • Globs et caractères génériques extensibles : Le shell réécrit les modèles comme * .doc dans les fichiers réels. Runtime.exec(String) n'effectue pas cette expansion.
  • Gestion des tuyaux et des redirections : Le shell configure la redirection de sortie, que Runtime.exec(String) ne gère pas.
  • Agrandissement des variables et des commandes : Le shell remplace les variables et les commandes du shell avant d'exécuter la commande. Runtime.exec(String) les transmet littéralement.

Solutions

Il existe deux approches pour gérer cette situation :

Déléguer à un shell (simple mais bâclé) :

Passer des commandes à un shell (par exemple, en utilisant Runtime.exec(String[])) :

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

Assumer les responsabilités du shell (sécurisé et robuste) :

Utiliser ProcessBuilder pour gérer le shell -tâches similaires, telles que l'expansion de variables, la redirection et la division de mots :

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