Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [10/07/2014 13:35] Hypathie [Script bash : enchaînement de commandes et redirection] |
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [10/07/2014 16:25] Hypathie [Enchaînements de commandes dans les scripts] |
||
---|---|---|---|
Ligne 26: | Ligne 26: | ||
</code> | </code> | ||
- | > Pour ce qui concerne les opérateurs de contrôle du point de vue | + | > Pour ce qui concerne les opérateurs de contrôle du point de vue de **l'enchaînement conditionné** (avec ''<nowiki>&&</nowiki>'' et ''<nowiki>||</nowiki>'' ) |
- | > de **l'enchaînement conditionné** (avec <nowiki>&&</nowiki> et <nowiki>||</nowiki> ) | + | |
> voir : [[atelier:chantier:script-bash-etat-de-sorie-et-les-tests?&#etat-de-sortie-et-code-de-retour|état de sortie et code de retour]]. | > voir : [[atelier:chantier:script-bash-etat-de-sorie-et-les-tests?&#etat-de-sortie-et-code-de-retour|état de sortie et code de retour]]. | ||
====Parallélisme et succession & , && et ;==== | ====Parallélisme et succession & , && et ;==== | ||
- | * Avec l'opérateur de contrôle "&" : parallélisme. | + | * Avec l'opérateur de contrôle ''&'' : parallélisme. |
>Toutes les commandes sont exécutées parallèlement. | >Toutes les commandes sont exécutées parallèlement. | ||
Ligne 41: | Ligne 40: | ||
>Par exemple, il faut que le fichier créé soit "connu" du shell pour qu'il puise être ouvert par "gedit" dans ce même shell.) | >Par exemple, il faut que le fichier créé soit "connu" du shell pour qu'il puise être ouvert par "gedit" dans ce même shell.) | ||
- | * Avec l'opérateur de contrôle "&&" : succession conditionnée. | + | * Avec l'opérateur de contrôle ''&&'' : succession conditionnée. |
>La commande suivante est exécutée successivement à la précédente, seulement si cette | >La commande suivante est exécutée successivement à la précédente, seulement si cette | ||
Ligne 47: | Ligne 46: | ||
>Voir [[atelier:chantier:script-bash-etat-de-sorie-et-les-tests#le-code-de-retour|code de retour]]. | >Voir [[atelier:chantier:script-bash-etat-de-sorie-et-les-tests#le-code-de-retour|code de retour]]. | ||
- | * Avec l'opérateur ";" : succession non conditionnée | + | * Avec l'opérateur '';'' : succession non conditionnée |
>Chaque commande est exécuté l'une après l'autre même si l'une d'elle a mal fonctionné. | >Chaque commande est exécuté l'une après l'autre même si l'une d'elle a mal fonctionné. | ||
Ligne 58: | Ligne 57: | ||
</code> | </code> | ||
- | En mettant "&&" entre les commandes, ce script fonctionne aussi bien qu'avec les ";". Mais avec "&", on obtiendrait un message d'erreur.\\ | + | >En mettant ''&&'' entre les commandes, ce script fonctionne aussi bien qu'avec les '';''.\\ Mais avec ''&'', on obtiendrait un message d'erreur.\\ |
- | >Dans cet exemple, //la valeur d'une commande// est nécessaire à la commande suivante. | + | >Dans cet exemple, __la valeur d'une commande__ est nécessaire à la commande suivante. |
- | >On n'a pas chercher à rediriger le résultat d'une commande vers un fichier | + | >On n'a pas chercher à rediriger le résultat d'une commande vers un fichier ou le contenu d'un fichier vers une commande (excepté pour concaténer dans le fichier créé la première ligne du futur script). |
- | >ou le contenu d'un fichier vers une commande (excepté pour concaténer dans | + | |
- | >le fichier créé la première ligne du futur script). | + | |
>Pour le faire, il faut utiliser les redirections (voir plus bas). | >Pour le faire, il faut utiliser les redirections (voir plus bas). | ||
>On n'a pas cherché non plus à transmettre le résultat d'une commande | >On n'a pas cherché non plus à transmettre le résultat d'une commande | ||
- | >à une autre commande (tube |) | + | >à une autre commande (tube ''|'') |
====Regroupement de commandes, parenthèses ou accolades ?==== | ====Regroupement de commandes, parenthèses ou accolades ?==== | ||
Ligne 77: | Ligne 74: | ||
Entre accolades, la valeur change commande après commande et le changement est conservé jusqu'à la dernière commande parce que toutes la série appartient au même [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#notion-de-processus|processus]]. | Entre accolades, la valeur change commande après commande et le changement est conservé jusqu'à la dernière commande parce que toutes la série appartient au même [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#notion-de-processus|processus]]. | ||
<note important> | <note important> | ||
- | Les accolades sont des mots-clé de bash. | + | Les accolades sont des mots-clé de bash.\\ |
Il ne faut donc pas oublier de mettre un espace entre l'accolade ouvrante et la première commande de la liste. | Il ne faut donc pas oublier de mettre un espace entre l'accolade ouvrante et la première commande de la liste. | ||
</note> | </note> | ||
Ligne 92: | Ligne 89: | ||
<note> | <note> | ||
- | Pour se servir des accolades pour conserver la valeur d'une variable et la faire changer de commande en commande, il ne faut pas terminer le regroupement de commandes par &.\\ | + | Pour se servir des accolades pour conserver la valeur d'une variable et la faire changer de commande en commande, il ne faut pas terminer le regroupement de commandes par ''&''.\\ |
Car cela a pour effet de ne pas exécuter chaque commande dans le shell courant mais dans un sous-shell. | Car cela a pour effet de ne pas exécuter chaque commande dans le shell courant mais dans un sous-shell. | ||
<code bash> | <code bash> | ||
Ligne 102: | Ligne 99: | ||
/home/hypathie | /home/hypathie | ||
</code> | </code> | ||
- | # le prompt ne revient pas il faut faire ctrl+c ! | + | |
+ | > Le prompt ne revient pas il faut faire ''Ctrlc'' ! | ||
</note> | </note> | ||
- | L'utilisation du groupement de commandes sert souvent à la redirection globale de l'entrée du groupe de commande ou à sa sortie.\\ On le verra plus loin. | + | >L'utilisation du groupement de commandes sert souvent à la redirection globale de l'entrée du groupe de commande ou à sa sortie.\\ On le verra plus loin. |
===(suite-de-commandes ;)=== | ===(suite-de-commandes ;)=== | ||
Ligne 159: | Ligne 158: | ||
====Notion de sous-shell ==== | ====Notion de sous-shell ==== | ||
- | Les variables comprises dans ces parenthèses, à l'intérieur du sous-shell, ne sont pas visibles par le reste du script. Le //processus parent// ou //père// ne peut pas accéder aux variables créées dans le //processus fils//, le //sous-shell//. | + | Les variables comprises dans ces parenthèses, à l'intérieur du sous-shell, ne sont pas visibles par le reste du script. Le __processus parent__ ou __père__ ne peut pas accéder aux variables créées dans __le processus fils, le sous-shell__. |
- | Dans le script ci-dessous, on voit que le terminal "reçoit le retour du shell père et celui du shell fils ( "echo $prenom" ). | + | Dans le script ci-dessous, on voit que le terminal "reçoit le retour du shell père et celui du shell fils\\ ( ''"echo $prenom"'' ). |
===Le processus père ne peut pas récupérer les variables d'un processus fils=== | ===Le processus père ne peut pas récupérer les variables d'un processus fils=== | ||
Ligne 172: | Ligne 171: | ||
</code> | </code> | ||
+ | nenette | ||
- | nenette | + | >Créer un sous-shell permet ainsi de protéger de ce qui se passe dans le processus fils. |
- | + | >Créer un processus fil permet aussi au processus père de continuer son programme "pendant" l'exécution du processus fils, ce qui évite de ralentir l'ensemble du programme. | |
- | Créer un sous-shell permet ainsi de protéger de ce qui se passe dans le processus fils.\\ | + | |
- | Créer un processus fil permet aussi au processus père de continuer son programme "pendant" l'exécution du processus fils : ça évite de ralentir l'ensemble du programme. | + | |
<note tip> | <note tip> | ||
Ligne 189: | Ligne 187: | ||
[1] 4245 | [1] 4245 | ||
</code> | </code> | ||
- | >Ici "[1]" est le jobID et "4245" est PID, l'identifiant du processus. | + | >Ici ''[1]'' est __le jobID__ et ''4245'' est __le PID__, l'identifiant du processus. |
- | >Pour aller plus loin voir la notion de processus et les commandes : ps ; top ; nice et renice. | + | >Pour aller plus loin voir la notion de processus et les commandes : ''ps'' ; ''top'' ; ''nice'' et ''renice''. |
>Dans le premier cas, si l'on ferme le terminal, on ferme aussi "iceweasel", | >Dans le premier cas, si l'on ferme le terminal, on ferme aussi "iceweasel", | ||
>processus fils du shell. | >processus fils du shell. | ||
- | >Mais dans le deuxième cas (en mettant & après la commande) le processus fils est en arrière plan et l'on peut donc utiliser le shell, ou fermer le terminal sans tuer en même temps le processus fils (iceweasel). | + | >Mais dans le deuxième cas (en mettant ''&'' après la commande) le processus fils est en arrière plan et l'on peut donc utiliser le shell, ou fermer le terminal sans tuer en même temps le processus fils (iceweasel). |
</note> | </note> | ||
===Lancer deux sous-shell en parallèle === | ===Lancer deux sous-shell en parallèle === | ||
Ligne 222: | Ligne 220: | ||
On passe en mode restreint pour diminuer les risques.\\ | On passe en mode restreint pour diminuer les risques.\\ | ||
En mode restreint, certaines commandes sont désactivées : | En mode restreint, certaines commandes sont désactivées : | ||
- | * cd | + | * ''cd'' |
- | * exec (commande qui permet des substitution de processus | + | * ''exec'' (commande qui permet des substitution de processus |
* empêche de sortir du mode restreint depuis le script qui la mis en place | * empêche de sortir du mode restreint depuis le script qui la mis en place | ||
* empêche les redirections de sortie (écrire dans des fichiers) | * empêche les redirections de sortie (écrire dans des fichiers) | ||
- | * empêche l'utilisation de commandes contenant des / (pour éviter des modification à la racine) | + | * empêche l'utilisation de commandes contenant ''/'' (pour éviter des modification à la racine) |
* empêche de modifier les valeurs des variables d'environnement | * empêche de modifier les valeurs des variables d'environnement | ||
- | * $PATH : en le modifiant on peut changer l'utilisation de certaines commandes. | + | * ''$PATH'' : en le modifiant on peut changer l'utilisation de certaines commandes. |
- | * $SHELL : en le modifiant on peut utiliser un autre interpréteur, en cours de programme. | + | * ''$SHELL'' : en le modifiant on peut utiliser un autre interpréteur, en cours de programme. |
- | * $BASH_ENV et $ENV : les modifications de l'environnement ne se font pas sans connaissances. | + | * ''$BASH_ENV'' et ''$ENV'' : les modifications de l'environnement ne se font pas sans connaissances. |
- | * $SHELLOPTS : où on peut changer les options d'environnement du shell | + | * ''$SHELLOPTS'' : où on peut changer les options d'environnement du shell |
* et les droits sont limités. | * et les droits sont limités. | ||
=====Redirections et le pipe ===== | =====Redirections et le pipe ===== |