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

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

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();
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