Samuel Thibault wrote:
Heu, le résultat est effectivement cela, mais l'explication est un peu
différente. Dans les deux cas les trois commandes sont exécutées dans
trois processus différents ; mais dans le deuxième cas, c'est un
sous-shell qui s'occupe de les lancer, et c'est la sortie de ce
sous-shell (donc des trois commandes aussi) qui est redirigée.
Merci Samuel. J'avais écrit une bêtise. Ton explication est juste, pas
la mienne.
En fait il est évident qu'un programme s'exécute obligatoirement dans
son propre processus et il n'y a pas de ménage à plusieurs dans un même
processus. Mais pour en avoir le coeur, je me suis fabriqué cette petite
manip pour illustrer ce comportement du shell.
J'ai créé deux scripts shells cmd1 et cmd2 contenant tous les deux la
même commande "sleep 1m" permettant d'endormir le processus durant 1
minute, temps largement suffisant pour me permettre d'effectuer des "ps
-af" sur une autre console pour voir les numéros de processus lancés
(PID) et les numéros de leur processus père (PPID).
J'ai donc lancé respectivement "./cmd1;./cmd2" puis "(./cmd1;./cmd2)"
et finalement "./cmd1 && ./cmd2" Voici les résultats :
1er cas (point-virgule sans les parenthèses)
PID 17333 (mon bash) crée, à une minute d'intervalle, deux procesus:
1- immédiatement le PID 18449 (bash) qui lance immédiatement le PID
18450 (sleep 1m)
2- une minute après nouveau processus PID 18524 (bash) qui lance
immédiatement PID 18525 (sleep 1m)
2ème cas (point-virgule avec les parenthèses)
PID 17333 (mon bash) crée immédiatement un procesus de PID 19109 (le
sous-shell) qui lui même crée, à une minute d'intervalle, deux processus :
1- immédiatement PID 19110 (bash) qui lance immédiatement PID 19111
(sleep 1m)
2- une minute après nouveau processus PID 19175 (bash) qui lance
immédiatement PID 19176 (sleep 1m)
Le comportement décrit par Samuel est évidemment bien respecté. Petite
complication due à l'exemple que j'ai pris : cmd1 et cmd2 sont des
scripts, ils s'exécutent donc eux même dans un shell qui lance la
commande sleep, d'où le doublement de processus relevés.
Le troisième cas suggéré par Pierre avec utilisation de && comme
séparateur au lieu du point virgule s'apparente en termes de processus
lancés au 1er cas sans les parenthèses. Donc pas de sous-shell créé.
Pour être complet sur cette question, on peut aussi utiliser le ||
(double barre, altgr-6) comme séparateur de commande pour réaliser un ou
logique. C'est-à-dire que la commande suivante s'exécute uniquement si
la précédente a échoué. Cela permet de faire dans les scripts des
messages d'erreurs du genre :
"cmd1 || echo cmd1 a échoué" Le message d'échec ne s'affiche que si
cmd1 a réellement échoué.
Dernière précision : comment le shell sait-il qu'une commande a réussi
ou échoué ? c'est la valeur retournée par une fonction de type exit dans
le schell ou dans le langage C. Si la commande exécute "exit 0", elle va
retourner au shell la valeur 0 qui signifie tout va bien, RAS, la
commande a réussi. Si la commande retourne autre chose que 0, cela
signifie que la commande a échoué et le numéro retourné peut être
utiliser pour savoir le numéro et donc la nature de l'erreur rencontré.
Le shell reporte la valeur retournée par la dernière commande exécuté
dans la variable $?.
Finalement pour revenir à la question initiale de Michel, la commande
suivante serait bien appropriée :
sudo apt-get update && sudo apt-get upgrade
Si le update n'a pas marché, le upgrade ne sera pas lancé.
Cordialement
Tarik
_______________________________________________
Liste de diffusion CarrefourBLinuX
[email protected]
http://lists.freearchive.org/mailman/listinfo/carrefourblinux
Pour s'inscrire par courriel :
'mailto:[EMAIL PROTECTED]'
Pour se retirer de la liste par courriel :
'mailto:[EMAIL PROTECTED]'
Archives : http://lists.freearchive.org/pipermail//carrefourblinux
Anciennes archives (Yahoogroupes) :
http://fr.groups.yahoo.com/group/carrefourblinux/messages
Rechercher : http://lists.freearchive.org/cgi-bin/search.cgi
Signets : http://fr.groups.yahoo.com/group/carrefourblinux/links/
Fiches EDU : http://blinuxwiki.pbwiki.com/FichesEdu