Exécuter combiner plusieurs commandes linux en une seule ligne
J'essaie de fusionner plusieurs commandes linux en une seule ligne pour effectuer une opération de déploiement. Par exemple
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
9 réponses
Si vous voulez exécuter chaque commande uniquement si la précédente a réussi, combinez-les en utilisant l'opérateur &&
:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Si l'une des commandes échoue, toutes les autres commandes qui la suivent ne seront pas exécutées.
Si vous voulez exécuter toutes les commandes, que les commandes précédentes aient échoué ou non, séparez-les par des points-virgules:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Dans votre cas, je pense que vous voulez le premier cas où l'exécution de la commande suivante dépend du succès de la précédente.
Vous pouvez également placer toutes les commandes dans un script et l'exécuter à la place:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(les barres obliques inverses à la fin de la ligne sont là pour empêcher le shell de penser que la ligne suivante est une nouvelle commande; si vous omettez les barres obliques inverses, vous devrez écrire la commande entière dans une seule ligne.)
Enregistrer dans un fichier, par exemple myscript
, et le rendre exécutable:
chmod +x myscript
Vous pouvez maintenant exécuter ce script comme les autres programmes sur la machine. Mais si vous ne le placez pas dans un répertoire répertorié dans votre variable d'environnement PATH
(par exemple /usr/local/bin
, ou sur certaines distributions Linux ~/bin
), vous devrez alors spécifier le chemin d'accès à ce script. S'il se trouve dans le répertoire courant, vous l'exécutez avec:
./myscript
Les commandes du script fonctionnent de la même manière que les commandes du premier exemple; la commande suivante ne s'exécute que si la commande précédente a réussi. Pour l'exécution inconditionnelle de toutes les commandes, il suffit de lister chaque commande seule ligne:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
J'ai trouvé que l'utilisation de; pour séparer les commandes ne fonctionne qu'au premier plan. par exemple :
cmd1; cmd2; cmd3 &
- n'exécutera cmd3
en arrière-plan, tandis que
cmd1 && cmd2 && cmd3 &
- exécutera toute la chaîne en arrière-plan S'il n'y a pas d'erreurs.
Pour répondre à l'exécution inconditionnelle, l'utilisation de parenthèses résout ceci:
(cmd1; cmd2; cmd3) &
- exécutera la chaîne de commandes en arrière-plan, même si une étape échoue.
Vous pouvez séparer vos commandes en utilisant un point-virgule:
cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install
C'est ce que tu veux dire?
Pour les exécuter tous en même temps, vous pouvez utiliser la touche " | " comme ceci:
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Si vous voulez exécuter toutes les commandes, que la précédente soit exécutée ou non, vous pouvez utiliser le point-virgule (;) pour séparer les commandes.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Si vous voulez exécuter la commande suivante uniquement si la commande réussit, vous pouvez utiliser && pour séparer les commandes.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Dans votre cas, l'exécution de commandes consécutives semble dépendre des commandes précédentes, alors utilisez le deuxième exemple, c'est-à-dire utilisez && pour joindre les commandes.
Quelle est l'utilité d'une seule Esperluette? Ce matin, j'ai fait un lanceur dans le panneau XFCE (dans Manjaro+XFCE) pour lancer 2 gestionnaires de mots de passe simultanément:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Mais ça ne marche pas comme je veux. C'est-à-dire que la première application démarre mais que la seconde ne démarre que lorsque la précédente est fermée: - /
Cependant, j'ai trouvé que (avec une seule Esperluette):
sh -c "keepassx & password-gorilla"
Et ça marche comme je veux maintenant...
Vous pouvez utiliser comme code suivant;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
Ça marche...
Je trouve beaucoup de réponses à ce genre de question trompeuses
Modifié à partir de ce post: https://www.webmasterworld.com/linux/3613813.htm
Le code suivant va créer une fenêtre bash et fonctionne exactement comme une fenêtre bash. Espérons que cette aide. Trop de réponses fausses / non fonctionnelles là-bas...
Process proc;
try {
//create a bash window
proc = Runtime.getRuntime().exec("/bin/bash");
if (proc != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
BufferedReader err = new BufferedReader(new InputStreamReader(
proc.getErrorStream()));
//input into the bash window
out.println("cd /my_folder");
out.println("rm *.jar");
out.println("svn co path to repo");
out.println("mvn compile package install");
out.println("exit");
String line;
System.out.println("----printing output-----");
while ((line = in.readLine()) != null) {
System.out.println(line);
}
while((line = err.readLine()) != null) {
//read errors
}
proc.waitFor();
in.close();
out.close();
err.close();
proc.destroy();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}