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
262
demandé sur approxiblue 2012-10-26 01:02:46

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
598
répondu Nikos C. 2014-04-23 19:07:36

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.

42
répondu Dean 2013-07-15 05:16:57

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?

9
répondu andrux 2012-10-25 21:06:16

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
4
répondu Kelly Poore 2018-04-19 21:49:27
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
1
répondu Mark Stevens 2012-10-25 21:05:32

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.

1
répondu Prabhu 2013-07-14 05:58:46

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...

0
répondu Nettlebay AP 2017-05-18 17:59:36

Vous pouvez utiliser comme code suivant;

cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install

Ça marche...

-1
répondu Deniz Güzel 2018-04-10 13:33:54

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();
            }
-1
répondu wwjih123 2018-09-27 16:10:37