J'essaie de fusionner plusieurs commandes Linux sur 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
la source
J'essaie de fusionner plusieurs commandes Linux sur 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
Si vous souhaitez exécuter chaque commande uniquement si la précédente a réussi, combinez-les à l'aide de 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 souhaitez exécuter toutes les commandes, que les 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 mettre 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 sur une seule ligne.)
Enregistrez-le dans un fichier, par exemple myscript
, et rendez-le exécutable:
chmod +x myscript
Vous pouvez maintenant exécuter ce script comme d'autres programmes sur la machine. Mais si vous ne le placez pas dans un répertoire répertorié dans votre PATH
variable d'environnement (par exemple /usr/local/bin
, ou sur certaines distributions Linux ~/bin
), vous devrez 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 s'exécute uniquement si la précédente a réussi. Pour une exécution inconditionnelle de toutes les commandes, listez simplement chaque commande sur sa propre ligne:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
||
place du point-virgule ou&&
si vous ne souhaitez exécuter la commande suivante que si la dernière a échoué. Comme pour essayer ceci, et s'il échoue, essayez cela.ls >/dev/null & ; echo $!
déclenche une erreur.tail -f my.log & && ./myscript
qui ne fonctionne pas .. veuillez suggérer.{ tail -f my.log & } && ./myscript
Cependant, notez que le&&
est inutile ici, car le premier travail s'exécute en arrière-plan et donc le deuxième travail ne peut pas connaître le résultat, car les deux travaux démarreront en même temps. Donc, vous pourriez aussi bien écrire:{ tail -f my.log & }; ./myscript
sudo
autorisations pour exécuter l'une des commandes? Dois-je mettre lesudo
au début de toutes les commandes ou simplement celui qui en a besoin? Comment puis-je transmettre le mot de passe à cette commande afin qu'il soit correctement exécuté?J'ai trouvé cela en utilisant; séparer les commandes ne fonctionne qu'au premier plan. par exemple :
cmd1; cmd2; cmd3 &
- ne s'exécuteracmd3
qu'en arrière-plan, tandis quecmd1 && cmd2 && cmd3 &
- exécutera toute la chaîne en arrière-plan SI il n'y a pas d'erreur.Pour répondre à une exécution inconditionnelle, l'utilisation de parenthèses résout ce problème:
(cmd1; cmd2; cmd3) &
- exécutera la chaîne de commandes en arrière-plan, même si une étape échoue.la source
Vous pouvez séparer vos commandes à l'aide d'un point-virgule:
C'est ça que tu veux dire?
la source
Pour les exécuter tous en même temps, vous pouvez utiliser la touche de ligne de tuyau "|" ainsi:
la source
Si vous souhaitez exécuter toutes les commandes, que la précédente s'exécute ou non, vous pouvez utiliser un point-virgule (;) pour séparer les commandes.
Si vous souhaitez exécuter la commande suivante uniquement si la commande précédente réussit, vous pouvez utiliser && pour séparer les commandes.
Dans votre cas, l'exécution de commandes consécutives semble dépendre des commandes précédentes, utilisez donc le deuxième exemple, c'est-à-dire utilisez && pour joindre les commandes.
la source
la source
cmd1 || cmd2
séparateur si vous avez besoincmd2
de l'exécuter uniquement s'ilcmd1
renvoie un état différent de zéro au shell, et vous pouvez l'utilisercmd1 ; cmd2
si vous souhaitez exécuter les deux commandes indépendamment de leur état de retour.Quelle est l'utilité d'une seule esperluette? Ce matin, j'ai fait un lanceur dans le panel XFCE (en Manjaro + XFCE) pour lancer 2 gestionnaires de mots de passe simultanément:
Mais ça ne marche pas comme je veux. IE, la première application démarre mais la seconde ne démarre que lorsque la précédente est fermée
Cependant, j'ai trouvé que (avec une seule esperluette):
et ça marche comme je veux maintenant ...
la source
;
, sauf que cela place le virgule devant lui en arrière-plan, c'est-à-dire que le shell ne verra pas sa sortie.Vous pouvez utiliser comme code suivant;
Ça marche...
la source
Je trouve beaucoup de réponses à ce genre de question trompeuses
Modifié de ce post: https://www.webmasterworld.com/linux/3613813.htm
Le code suivant crée une fenêtre bash et fonctionne exactement comme une fenêtre bash. J'espère que cela t'aides. Trop de mauvaises réponses / ne fonctionnent pas là-bas ...
la source