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
Libérer: 2024-12-05 22:22:10
original
478 Les gens l'ont consulté

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 });
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal