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

Répondre à