Bonjour,
Comment s'assurer dans un script bash qu'une commande 1 s'exécute et que la commande 2 suivante n'est exécutée qu'après la fin réelle de la commande 1 ?
Cdlt,
Bonjour,
Comment s'assurer dans un script bash qu'une commande 1 s'exécute et que la commande 2 suivante n'est exécutée qu'après la fin réelle de la commande 1 ?
Cdlt,
C est le fonctionnement normal du code quelque soit le langage
tant qu il n y a pas de conditionnement liant ces commandes
si tu veux etre dans l absolu tu peux forcer
mais n a que peu de sens (en general)
Code : Sélectionner tout - Visualiser dans une fenêtre à part commande1 ; commande2
Pi lancer une commande 2 sans vérifier que la commande 1 s'est correctement terminée, c't'un peu cass'gueul', nan ?
Bonjour,
Par fois il vaut le coup d'effectuer des recherches en différentes langues, notamment en anglais, sur des moteurs de recherche ...
En effectuent une recherche sur Google avec " bash wait for end of command before executing next " j'ai trouvé cette page:
https://unix.stackexchange.com/quest...vious-finished
Je me permet de copier ici cette réponse qui me semble être intéressante:
Shell scripts will run each command sequentially, waiting for the first to finish before the next one starts. You can either join commands with ; or have them on separate lines:
command1; command2
or
command1
command2
There is no need for ; if the commands are on separate lines. You can also choose to run the second command only if the first exited successfully. To do so, join them with &&:
command1 && command2
or
command1 &&
command2
For more information on the various control operators available to you, see here.![]()
Mouais...
Àmha la première partie n'ajoute pas grand-chose à la réponse de frp31.Shell scripts will run each command sequentially, waiting for the first to finish before the next one starts. You can either join commands with ; or have them on separate lines:
command1; command2
or
command1
command2
There is no need for ; if the commands are on separate lines.
L'utilisateur n'a pas précisé ce qu'il appelle "fin réelle de la commande". Fin des sous-process? Fin des opérations mises en cache (écritures disque, etc.)? Fin avec succès?You can also choose to run the second command only if the first exited successfully. To do so, join them with &&:
command1 && command2
or
command1 &&
command2
et comme il ne répond plus...
Bonjour,
Un exemple de commande qui ne fonctionne pas tout à fait comme désiré:
Puisque gvim rend la main sans se terminer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part gvim fichier && cat fichier
chainer les deux commandes avec && n'est pas la bonne réponse, pour s'en convaincre il suffit de considérer false && echo "2e commande".
l'énoncé parle d'exécuter la 2e commande après que la première a terminé, il n'est pas fait mention du succès de la 1ere commande, si on considère deux commandes "classiques" c'est donc le point virgule qu'il convient d'utiliser, la première réponse était la bonnefrp31
gvim -f && cat fichier ?
bon, plus sérieusement en général les programmes qui fork ou qui daemonize ne sont pas considérés comme des "commandes" normales, ça va soit être des services/daemons soit des interfaces graphiques etc. bref, j'imagine qu'on doit pouvoir s'en sortir en bash en jouant avec $! et wait (laissé en exercice)
&& n'est pas la bonne solution. && permet le déclenchement conditionnel :
commande2 n'est exécuté que si commande1 a retourné 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part commande1 && commande2
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Voici une proposition qui répond au premier critère :
Il n'est pas possible de satisfaire de manière portable la deuxième condition car une commande peut très bien rendre la main tout en continuant à s'exécuter en tâche de fond. Dans ce cas, le processus survivant n'est plus identifiable car détaché du shell courant et de son process group. Il faut qu'un mécanisme particulier permette de tracer les forks. Sous Linux, les control-groups permettent ce style de traitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 commande1="ls -l" commande2="date" command -v $commande1 || { impossible d'exécuter "$commande1" ; exit 1 ; } && $commande1 ; $commande2
Voici un script qui répond au deuxième critère en s'appuyant sur les control-groups, l'utilisateur doit être root ou avoir le droit d'utiliser les commandes cgcreate, cgclassify et cgdelete avec sudo:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 commande1="xxxx" commande2="yyyy" p=$(mktemp) sudo cgcreate -g cpu:$p sudo cgclassify -g cpu:$p $$ echo "Exécution commande 1" $commande1 pid=$! while [ $(ps -o pid,cgroup,args | grep $(basename $p) | grep -v grep| grep -v "pid\,cgroup\,args" | wc -l) -gt 1 ]; do # attente fin du premier processus sleep 2 done (sleep 10; sudo cgdelete cpu:$p)& echo "Exécution commande 2" $commande2
Partager