Java - Exécution De Commandes Bash
J'ai la classe suivante. Il me permet d'exécuter des commandes via java.
public class ExecuteShellCommand {
public String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
}
Quand je lance les commandes, le résultat de la commande précédente n'est pas enregistré. Par exemple:
public static void main(String args[]) {
ExecuteShellCommand com = new ExecuteShellCommand();
System.out.println(com.executeCommand("ls"));
System.out.println(com.executeCommand("cd bin"));
System.out.println(com.executeCommand("ls"));
}
Donne la sortie:
bin
src
bin
src
Pourquoi ne pas le deuxième " ls " commande afficher le contenu du répertoire 'bin'?
Voir aussi Lors de l'Exécution.exec() ne sont pas pour beaucoup de bons conseils sur la création et la manipulation d'un processus correctement. Puis de les ignorer, il se réfère à
Bonjour. J'ai essayé d'utiliser votre classe à exécuter Bash - Commandes dans mon application Java, mais lorsque je lance la commande "cat", elle renvoie null...
exec
et l'utilisation d'un ProcessBuilder
pour créer le processus.Bonjour. J'ai essayé d'utiliser votre classe à exécuter Bash - Commandes dans mon application Java, mais lorsque je lance la commande "cat", elle renvoie null...
OriginalL'auteur mickzer | 2014-11-09
Vous devez vous connecter pour publier un commentaire.
De commencer un nouveau processus avec
Runtime.exec(command)
. Chaque processus dispose d'un répertoire de travail. Normalement, c'est le répertoire dans lequel le parent processus a été lancé, mais vous pouvez modifier le répertoire dans lequel votre processus de démarrage.Je vous recommande d'utiliser ProcessBuilder
Si vous voulez exécuter plusieurs commandes dans un shell, il serait préférable de créer un temporaire shell script et l'exécuter.
Bien sûr, vous pouvez également utiliser n'importe quel autre script sur votre système. La génération d'un script lors de l'exécution rend parfois le sens, par exemple si les commandes qui sont exécutées à modifier. Mais vous devriez d'abord essayer de créer un script que vous pouvez appeler avec des arguments au lieu de générer dynamiquement à l'exécution.
Il pourrait aussi être raisonnable d'utiliser un moteur de template comme la vitesse si le script de génération est complexe.
Vous avez raison. J'ai ajouté une ligne qui ferme la
PrintWriter
. Comme conséquence, le sous-tendent les lecteurs et les flux seront fermés.puis-je exécuter plusieurs commandes sans créer de fichiers temporaires?
J'ai besoin d'ajouter un
InterruptedException
à jette pour satisfaire le compilateur (Java 8)OriginalL'auteur René Link
Chaque invocation s'exécute dans sa propre coquille. Ainsi, le "cd" de la 2ème invocation n'est pas vu par la troisième.
Voir: https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.Chaîne de caractères).
Cela indique que la commande est exécutée dans un processus séparé. Ainsi, vous avez donné naissance à 3 processus.
Si vous voulez que tous les 3 dans le même processus, essayez ceci:
J'ai mis à jour ma réponse avec cette info.
Permettez-moi de reformuler ma question.. Est-il un moyen pour exécuter une série de commandes dans le même contexte, l'un après l'autre? Par exemple, il serait possible de prendre une série d'entrées de l'utilisateur et de les transmettre dans un processus de shell?
com.executeCommand("ls; cd bin; ls");
provoque uneIOException
à soulever:Cannot run program "ls;": error=2, No such file or directory
OriginalL'auteur EJK
Vous pouvez former un complexe de commande bash qui fait tout: "ls"; cd bin; ls". Pour faire ce travail vous avez besoin pour invoquer explicitement bash. Cette approche devrait vous donner toute la puissance de la ligne de commande bash (citation de manutention, de $ d'expansion, tuyaux, etc.).
OriginalL'auteur Steve Zobell
chaque commande, vous êtes en cours d'exécution a son propre shell bash, donc une fois que vous cd vers le répertoire et pour la prochaine commande, vous êtes à l'ouverture de nouveaux shell bash
essayez de modifier votre commande à
Vous pouvez les envelopper dans un script bash et à l'appeler, également utiliser
ProcessBuilder
au lieu deRuntime
Correction mineure, comme écrit dans la question, les commandes sont exécutées sans coquille. Les programmes spécifiés sont simplement exécuté dans un fork du processus.
OriginalL'auteur Jigar Joshi
Chaque commande est exécutée individuellement. Ils ne se partagent le contexte.
OriginalL'auteur vatsal
pour référence future: exécution de commandes bash après le cd , dans un sous-répertoire:
OriginalL'auteur jmullee