logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 [07/06/2014 09:20]
Hypathie [Redirections et le pipe]
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [08/07/2014 20:17]
Hypathie [Redirections et le pipe]
Ligne 1: Ligne 1:
-====== ​script ​bash : enchaînement de commandes et redirection ​ ======+====== ​Script ​bash : enchaînement de commandes et redirection ​ ======
  
   * Niveau requis : {{tag>​débutant}}   * Niveau requis : {{tag>​débutant}}
   * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)   * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
   * Suivi : {{tag>​à-placer}}   * Suivi : {{tag>​à-placer}}
-    * Création par **Hypathie** 18/03/2014+    * Création par [[user>Hypathie]] 18/03/2014
     * Testé par <​Hypathie>​ le <Juin 2014>     * Testé par <​Hypathie>​ le <Juin 2014>
   * Commentaires sur le forum : [[https://​debian-facile.org/​viewtopic.php?​pid=92203#​p92203 | Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[https://​debian-facile.org/​viewtopic.php?​pid=92203#​p92203 | Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
Ligne 22: Ligne 22:
 =====Enchaînements de commandes dans les scripts===== =====Enchaînements de commandes dans les scripts=====
 Parmi les opérateurs d'​enchaînement de commandes (voir [[atelier:​chantier:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-controle|les opérateurs de contrôle]])\\ Parmi les opérateurs d'​enchaînement de commandes (voir [[atelier:​chantier:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-controle|les opérateurs de contrôle]])\\
-  * considérons :   +  * considérons ​maintenant ​:   
 <​code>​ <​code>​
   &    && ​ ;  ( )    { }  ​   &    && ​ ;  ( )    { }  ​
 </​code>​ </​code>​
  
-Pour les opérateurs de contrôle du point de vue de **l'​enchaînement conditionné** (avec && ​|| ) 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]].+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> ​ 
 +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====+====Parallélisme ​et succession ​& , && et ;====
  
-===1) les opérateurs ​& , && et ;=== +  * Avec l'​opérateur de contrôle "&" : parallélisme. 
-Reprenons ​le script ​"scriptx", ​et changeons les ";" ​d'abord par "&", puis par "&&"​+ 
 +>Toutes les commandes sont exécutées parallèlement.  
 +>Dans l'​exemple ci-dessus, chaque commande étant traitée par un sous-shell,  
 +>le résultat d'une commande ne peut pas être conservée dans un même [[atelier:​chantier:​bash-les-differents-caracteres-speciaux?&#​notion-de-processus|processus]],​ 
 +>afin que chaque commande puisse ​"travailler" ​en rapport au résultat de la  
 +>​commande précédente.  
 +>Par exempleil 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. 
 + 
 +>La commande suivante est exécutée successivement à la précédente,​ seulement si cette 
 +>​précédente commande a fonctionné. 
 +>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 
 + 
 +>Chaque commande est exécuté l'une après l'​autre même si l'une d'elle a mal fonctionné. 
 +===Exemple===
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
Ligne 39: Ligne 58:
 { read nom && echo "#​!/​bin/​bash"​ >> $nom && chmod u+x $nom && mv ~/$nom ~/​MesScripts && /​usr/​bin/​gedit ~/​MesScripts/​$nom ;} { read nom && echo "#​!/​bin/​bash"​ >> $nom && chmod u+x $nom && mv ~/$nom ~/​MesScripts && /​usr/​bin/​gedit ~/​MesScripts/​$nom ;}
 </​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.\\ ​
-Pourquoi ? 
  
-  * Avec l'​opérateur de contrôle "&"​ : toutes les commandes sont exécutées parallèlement.  +>Dans cet exemple, ​//la valeur d'une commande// est nécessaire à la commande suivante. 
-(Dans l'exemple ​ci-dessus, chaque commande étant traitée par un sous-shell, la valeur d'une commande ​ne peut pas être conservée dans un même processus pour que chaque ​commande ​puisse "​travailler en rapport au RESULTAT de la commande précédentePar exemple, il faut que le fichier créé soit "​connu"​ du shell pour qu'il puise être ouvert par "​gedit"​ dans ce même shell.)+>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) 
 +>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  
 +>à une autre commande (tube |
  
-  * Avec l'​opérateur de contrôle "&&"​ : la commande suivante est exécutée successivement à la précédente seulement si cette précédente commande a fonctionné (voir [[atelier:​chantier:​script-bash-etat-de-sorie-et-les-tests#​le-code-de-retour|code de retour]]).  +====Regroupement de commandes, parenthèses ou accolades ?==== 
-  +Le shell bash fournit deux mécanismes pour regrouper les commandes
-  * Avec l'​opérateur ";"​ chaque commande est exécuté l'une après l'​autre,​ même si l'une d'elle a mal fonctionné.  +  - l'​insertion de la suite de commandes entre accolades ​
-  +  - l'​insertion de cette suite de commandes entre une paire de parenthèses.
-<​note>​ +
-Dans l'​exemple avec "​scriptx",​ on a récupéré **la valeur d'une commande** pour s'en servir dans une succession de commandes.\\  +
-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). 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 à une autre commande (tube |)  +
-</​note>​ +
- +
-====Regroupement de commandes==== +
-le shell bash fournit deux mécanismes pour regrouper les commandesl'​insertion de la suite de commandes entre accolades ​et l'​insertion de cette suite de commandes entre une paire de parenthèses.+
  
 ==={ suite-de-commandes ;}=== ==={ suite-de-commandes ;}===
  
-Les accolades sont des mots-clé de bash.\\  +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]]. 
-Il ne faut donc pas oublier de mettre un **espace entre l'​accolade ouvrante et la première commande** de la liste. +<note important>​ 
-Entre accolades, la valeur change commandes après commande ; le changement est conservé jusqu'​à la dernière commande parce que toutes les modifications sont faites dans le shell courant. +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. 
 +</​note>​ 
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
 { pwd ; cd ~/Documents ; echo $(pwd) ;} { pwd ; cd ~/Documents ; echo $(pwd) ;}
 </​code>​ </​code>​
-Retour :+
 <​code>​ <​code>​
 /​home/​hypathie /​home/​hypathie
 /​home/​hypathie/​Documents /​home/​hypathie/​Documents
 </​code>​ </​code>​
 +
 <​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 à pour effet de ne pas exécuter chaque commande dans le shell courant mais dans un sous-shell.+Car cela pour effet de ne pas exécuter chaque commande dans le shell courant mais dans un sous-shell. ​
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
 { pwd ; cd ~/Documents ; echo $(pwd) ;} & { pwd ; cd ~/Documents ; echo $(pwd) ;} &
 </​code>​ </​code>​
-retour :+
 <​code>​ <​code>​
 /​home/​hypathie ​   /​home/​hypathie ​  
Ligne 101: Ligne 120:
 echo $nom echo $nom
 </​code>​ </​code>​
-Retour :+
 <​code>​ <​code>​
 hypathie hypathie
Ligne 118: Ligne 137:
 echo $var3 echo $var3
 </​code>​ </​code>​
-retour :+
 <​code>​ <​code>​
 yep yep
Ligne 133: Ligne 152:
 ( var3="​au revoir"​ ; echo $var3 ) ( var3="​au revoir"​ ; echo $var3 )
 </​code>​ </​code>​
-retour :+
 <​code>​ <​code>​
 coucou coucou
Ligne 141: Ligne 160:
  
 ====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**, le script, ​ne peut pas lire les 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-dessus ​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 154: Ligne 173:
 </​code>​ </​code>​
  
-Retour : 
  
   nenette   nenette
   ​   ​
-Créer un sous-shell permet ainsi de protéger de ce qui se passe dans le processus fils.\+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. 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>
 +En graphique, un sous-shell pour récupérer la main sur le terminal, c'est bien pratique 8-)\\
 +Comparez :
 +<code bash>
 +iceweasel
 +</​code>​
 +avec :
 +<code bash>
 +iceweasel &
 +[1] 4245
 +</​code>​
 +>Ici "​[1]"​ est le jobID et "​4245"​ est PID, l'​identifiant du processus.
 +>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", ​
 +>​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).
 +</​note>​
 ===Lancer deux sous-shell en parallèle === ===Lancer deux sous-shell en parallèle ===
 Il est possible de lancer deux processus en parallèle. Il est possible de lancer deux processus en parallèle.
Ligne 178: Ligne 215:
   set --restricted   set --restricted
   ​   ​
-ou set -r)+ ou  
 + 
 +  ​set -r 
  
-===à quoi ça sert dans les script ?===+===Usage dans les scripts ​===
 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 :
Ligne 274: Ligne 314:
 ===Utilisation du "text processing"​ === ===Utilisation du "text processing"​ ===
   * Tout est là : [[http://​wiki.debian-facile.org/​atelier:​chantier:​les-commandes-join-paste-split-et-nl|http://​wiki.debian-facile.org/​atelier:​chantier:​les-commandes-join-paste-split-et-nl]]   * Tout est là : [[http://​wiki.debian-facile.org/​atelier:​chantier:​les-commandes-join-paste-split-et-nl|http://​wiki.debian-facile.org/​atelier:​chantier:​les-commandes-join-paste-split-et-nl]]
 +
 +====Le pipe ====
 +
 +Tout est là : [[doc:​programmation:​shell:​pipe|le pipe]]
  
 ====Un petit exercice sur opérateurs d'​enchaînement et de redirection==== ====Un petit exercice sur opérateurs d'​enchaînement et de redirection====
Ligne 320: Ligne 364:
   * **$?** : permet ici de vérifier que la commande précédente s'est déroulée avec succès quand "​**;​**"​ a été utilisé, inutile de vérifier avec **&&​**.   * **$?** : permet ici de vérifier que la commande précédente s'est déroulée avec succès quand "​**;​**"​ a été utilisé, inutile de vérifier avec **&&​**.
  
-====Le pipe ==== 
- 
-Tout est là : [[doc:​programmation:​shell:​pipe|le pipe]] 
  
 =====La suite c'est ici===== =====La suite c'est ici=====
 [[atelier:​chantier:​script-bash-etat-de-sorie-et-les-tests|script-bash-etat-de-sorie-et-les-tests]] [[atelier:​chantier:​script-bash-etat-de-sorie-et-les-tests|script-bash-etat-de-sorie-et-les-tests]]
doc/programmation/shells/script-bash-enchainement-de-commandes-et-etat-de-sortie.txt · Dernière modification: 21/10/2015 19:19 par milou

Pied de page des forums

Propulsé par FluxBB