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 [04/06/2014 05:51]
Hypathie [enchaînements de commandes dans les scripts]
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [07/06/2014 07:08]
Hypathie [Enchaînements de commandes dans les scripts]
Ligne 1: Ligne 1:
-====== script bash : enchaînement de commandesredirection ​; état de sortie ​======+====== script bash : enchaînement de commandes ​et redirection ​ ======
  
-  ​* Objet : du tuto FIXME +  * Niveau requis : {{tag>​débutant}}
-  ​* Niveau requis : FIXME {{tag>​débutant ​avisé}} +
-  * Commentaires : //Contexte d'​utilisation du sujet du tuto. // FIXME+
   * 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>en-chantier à-tester ​à-placer}} ​- FIXME Pour choisir, voir les autres Tags possibles dans [[:​atelier:#​tags|l'​Atelier]]. +  * Suivi : {{tag>​à-placer}} 
-    * Création par **Hypathie** ​03/06/2014 +    * Création par **Hypathie** ​18/03/2014 
-    * Testé par <...> le <...FIXME +    * Testé par <Hypathie> le <Juin 2014
-  * Commentaires sur le forum : [[url | Lien vers le forum concernant ce tuto]] ((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) FIXME+  * 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 !))
  
-**Nota : wiki n°4**+**Nota : wiki n°4**\\ 
 +**Les autres numéros :** 
 +  * wiki n°1 : [[atelier:​chantier:​debuter-avec-les-scripts-shell-bash]] 
 +  * wiki n°2 : [[atelier:​chantier:​script-bash-variables-arguments-parametres|script-bash-variables-arguments-parametres]] 
 +  * wiki n°3 : [[atelier:​chantier:​script-bash-detail-sur-les-parametres-et-les-boucles|script-bash-detail-sur-les-parametres]]  
 +   
 +  * wiki n°5 : [[atelier:​chantier:​script-bash-etat-de-sorie-et-les-tests|script-bash-etat-de-sorie-et-les-tests]] 
 +  * wiki n°6 : [[atelier:​chantier:​script-bash-les-tableaux|script-bash-les-tableaux]] 
 +  * wiki n°7 : [[atelier:​chantier:​script-bash-les-fonctions|script-bash-les-fonctions]]
  
 Contributeurs,​ les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! Contributeurs,​ les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
  
-===== 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 : les opérateurs de contrôle)** considérons :   +  ​* considérons :   
 <​code>​ <​code>​
   &    && ​ ;  ( )    { }  ​   &    && ​ ;  ( )    { }  ​
 </​code>​ </​code>​
  
-====1) les opérateurs & , && et ;====+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]]. 
 + 
 +====parallélisme et succession==== 
 + 
 +===1) les opérateurs & , && et ;===
 Reprenons le script "​scriptx",​ et changeons les ";"​ d'​abord par "&",​ puis par "&&"​ Reprenons le script "​scriptx",​ et changeons les ";"​ d'​abord par "&",​ puis par "&&"​
 <code bash> <code bash>
Ligne 32: Ligne 42:
 Pourquoi ? Pourquoi ?
  
-  ​* **Avec l'​opérateur de contrôle "&"​ : toutes les commandes sont exécutées parallèlement.**\\  ​+  * Avec l'​opérateur de contrôle "&"​ : toutes les commandes sont exécutées parallèlement. ​
 (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édente. 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.) (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édente. 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 "&&"​ : 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 ";"​ chaque commande est exécuté l'une après l'​autre,​ même si l'une d'elle a mal fonctionné.**\\ +  * 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é. ​
    
 <​note>​ <​note>​
Ligne 43: Ligne 55:
 </​note>​ </​note>​
  
-====2) Deux syntaxes : { suite-de-commandes ​;} ou (suite-de-commandes;​)====+====Regroupement ​de commandes====
 le shell bash fournit deux mécanismes pour regrouper les commandes; l'​insertion de la suite de commandes entre accolades et l'​insertion de cette suite de commandes entre une paire de parenthèses. le shell bash fournit deux mécanismes pour regrouper les commandes; l'​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.\\ ​ 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.
Ligne 74: Ligne 87:
 </​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 ;)===
  
 Les parenthèses sont des opérateurs.\\ ​ Les parenthèses sont des opérateurs.\\ ​
 Il n'y a donc pas besoin d'​espace entre la parenthèse ouvrante et la première commande.\\ Il n'y a donc pas besoin d'​espace entre la parenthèse ouvrante et la première commande.\\
 Insérée dans une parenthèse,​ la suite de commandes est exécutée dans un sous-shell.\\ ​ Insérée dans une parenthèse,​ la suite de commandes est exécutée dans un 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. ​ 
  
 <code bash> <code bash>
Ligne 86: Ligne 99:
 nom=nenette nom=nenette
 (prenom=hypathie ; echo $prenom ) (prenom=hypathie ; echo $prenom )
-echo $nom $prenom+echo $nom
 </​code>​ </​code>​
 Retour : Retour :
 <​code>​ <​code>​
 +hypathie
 nenette nenette
 </​code>​ </​code>​
 Voir : [[http://​abs.traduc.org/​abs-fr/​ch21.html|Guide avancé d'​écriture des scripts Bash: 21. Sous-shells]] Voir : [[http://​abs.traduc.org/​abs-fr/​ch21.html|Guide avancé d'​écriture des scripts Bash: 21. Sous-shells]]
  
-=====Redirections dans les scripts===== +<note tip> 
-*Prérequis : [[doc:​programmation:​shell:shell#rediriger-l-affichage]] et le lien qu'on y trouve [[doc:​programmation:shell:chevrons]]+On ne confondra plus ! 
 +<code bash> 
 +#​!/​bin/​bash 
 +{ var1=yep ;} 
 +echo $var1 
 +var3=coucou 
 +{ var4=yep ; $var4 ;} 
 +echo $var3 
 +</​code>​ 
 +retour : 
 +<​code>​ 
 +yep 
 +essai.sh: ligne5: yep : commande introuvable 
 +coucou 
 +</​code>​ 
 + 
 +Mais : 
 +<code bash> 
 +#​!/​bin/​bash 
 +var1=coucou 
 +(var2=yep ) 
 +echo $var1 $var2 
 +( var3="au revoir"​ ; echo $var3 ) 
 +</​code>​ 
 +retour : 
 +<​code>​ 
 +coucou 
 +au revoir 
 +</​code>​ 
 +</​note>​ 
 + 
 +====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
 + 
 +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"​ ). 
 + 
 +===Le processus père ne peut pas récupérer les variables d'un processus fils=== 
 + 
 +<code bash> 
 +#!/​bin/​bash 
 +nom=nenette 
 +( prenom=hypathie ) 
 +echo $nom $prenom 
 +</​code>​ 
 + 
 +Retour : 
 + 
 +  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 ça évite de ralentir l'​ensemble du programme. 
 +===Lancer deux sous-shell en parallèle === 
 +Il est possible de lancer deux processus en parallèle. 
 +Comparez le retour des lignes n°2 et n°3 avec celles des lignes n°5 et n°6 du code ci-dessous. 
 +<code bash> 
 +#​!/​bin/​bash 
 +( echo "​bonjour"​ ) & ( echo "au revoir"​ ) 
 +( cd /etc/apt ; ls ) & ( cd /​etc/​calendar ; ls ) 
 +echo " " 
 +cd /etc/apt ; ls 
 +cd /​etc/​calendar ; ls 
 +</​code>​ 
 + 
 + 
 +====Le shell restreint ==== 
 +===Passer en mode restreint === 
 + 
 +  set --restricted 
 +   
 +( ou set -r)
  
 +===à quoi ça sert dans les script ?===
 +On passe en mode restreint pour diminuer les risques.\\
 +En mode restreint, certaines commandes sont désactivées :
 +  * cd
 +  * 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 les redirections de sortie (écrire dans des fichiers)
 +  * empêche l'​utilisation de commandes contenant des / (pour éviter des modification à la racine)
 +  * empêche de modifier les valeurs des variables d'​environnement ​
 +    * $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.
 +    * $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
 +  * et les droits sont limités.
 +=====Redirections et le pipe dans les scripts=====
 +  * À voir : 
 +    * [[atelier:​chantier:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-redirection|un tableau des opérateurs de redirection]]
 ====Rappels :====  ====Rappels :==== 
  
-Les redirections permettent de travailler non pas en se servant du code de retour (qui indique la réussite ou l'​échec de l'​exécution d'une commande) mais sur le résultat d'une commande.\\ +Les redirections permettent de travailler non pas en se servant du code de retour (qui indique la réussite ou l'​échec de l'​exécution d'une commande) mais sur les flux.\\ 
 Un processus unix possède (par défaut) trois voies d'​interaction entre le système et l'​utilisateur. Une entrée et deux sorties. Chacun de ces "​lieux"​ sont identifiés par un descripteur de fichier. Un processus unix possède (par défaut) trois voies d'​interaction entre le système et l'​utilisateur. Une entrée et deux sorties. Chacun de ces "​lieux"​ sont identifiés par un descripteur de fichier.
   -une entrée standard (par défaut le clavier stdin), de descripteur 0 (nom de l'​entrée du processus, ne pas confondre avec le code de retour !);   -une entrée standard (par défaut le clavier stdin), de descripteur 0 (nom de l'​entrée du processus, ne pas confondre avec le code de retour !);
Ligne 113: Ligne 213:
              le fichier quand il existe et que l'​option noclobber (-c) est activée.              le fichier quand il existe et que l'​option noclobber (-c) est activée.
 </​code>​ </​code>​
-====1) opérateurs ​de sortie ​==== +====Opérateurs ​de sortie ​et opérateurs d'​entrée ​==== 
-<code bash> ​  +  ​* Tout est là [[doc:​programmation:shell:​chevrons| les chevrons]] \\ 
- > ​crée un fichier ou le réactualise ; redirige le canal choisi vers un fichier et force sa création,  + 
-     si le fichier existe son contenu est recrée et numéro d'​inode du fichier d'​origine est conservé. +===Opérateurs de sortie dans un script :=== 
-</​code>​ +
-<code bash> +
-ls -l >​chemin-fichier.txt +
-</​code>​ +
-est un équivalent de +
-<code bash> +
-ls -l 1> chemin-fichier.txt +
-</​code>​ +
-===Dans un script :===+
 <code bash> <code bash>
 #!/bin/bash #!/bin/bash
Ligne 152: Ligne 244:
 Amateurs de magie blanche et noire voir ce fil : [[http://​debian-facile.org/​viewtopic.php?​pid=86634#​p86634]] Amateurs de magie blanche et noire voir ce fil : [[http://​debian-facile.org/​viewtopic.php?​pid=86634#​p86634]]
 </​note>​ </​note>​
-  *redirection de commande vers un fichier, si le fichier existe, ​les données sont ajoutées à la suite du fichier. ​+ 
 +===Opérateurs d'​entrée dans les scripts=== 
 <code bash> <code bash>
- >>  ​+< Place, en entrée d'une commande, un contenu. 
 +</code 
 +<code bash> 
 +cat < /​chemin/​du/​fichier.txt ​ # est un équivalent de cat /​chemin/​du/​fichier.txt
 </​code>​ </​code>​
 +<code bash>
 + <<​ Redirige en entrée une série de données.  ​
 +</​code>​
 +On nomme cette redirection "​label"​.\\ Redirection utilisée dans un document en ligne dont on se sert que pour certaines commandes, comme ftp ou cat.\\ Voir : [[http://​abs.traduc.org/​abs-5.0-fr/​ch18.html#​heredocref]]\\ ​
 +Ne pas confondre avec la commande e2label, voir : [[doc:​systeme:​e2label]]
 +
 +===Usages de la sortie d'​erreur dans les scripts===
  
-  *La sortie standard d'​erreur peut être dirigée vers un fichier en le créant ou en l'​écrasant :+  * La sortie standard d'​erreur peut être dirigée vers un fichier en le créant ou en l'​écrasant :
 <code bash> <code bash>
 ls vi 2>​err ​  # retour du prompt : le message d'​erreur a été inscrit ​ ls vi 2>​err ​  # retour du prompt : le message d'​erreur a été inscrit ​
Ligne 211: Ligne 315:
                              ​c'​est-à-dire le fichier "​erreur"​.                              ​c'​est-à-dire le fichier "​erreur"​.
 </​code>​ </​code>​
-====2)Opérateurs d'​entrée : ==== 
-<code bash> 
-< Place, en entrée d'une commande, un contenu. 
-</​code> ​ 
-<code bash> 
-cat < /​chemin/​du/​fichier.txt ​ # est un équivalent de cat /​chemin/​du/​fichier.txt 
-</​code>​ 
-<code bash> 
- <<​ Redirige en entrée une série de données.  ​ 
-</​code>​ 
-On nomme cette redirection "​label"​.\\ Redirection utilisée dans un document en ligne dont on se sert que pour certaines commandes, comme ftp ou cat.\\ Voir : [[http://​abs.traduc.org/​abs-5.0-fr/​ch18.html#​heredocref]]\\ ​ 
-Ne pas confondre avec la commande e2label, voir : [[doc:​systeme:​e2label]] 
  
-====3) Un petit exercice sur opérateurs ====+ 
 +====Un petit exercice sur opérateurs ====
 Écrire un script qui crée le dossier "​ABCD"​ et 4 fichiers vides (nommés a b c d) ; Écrire un script qui crée le dossier "​ABCD"​ et 4 fichiers vides (nommés a b c d) ;
 qui liste le contenu de "​ABCD"​ et qui inscrit le résultat dans un fichier nommé "​ls1"​ qui sera placé dans "​ABCD"​ ; qui liste le contenu de "​ABCD"​ et qui inscrit le résultat dans un fichier nommé "​ls1"​ qui sera placé dans "​ABCD"​ ;
Ligne 278: Ligne 371:
   * **$?** : 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=====
 +[[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