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
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [08/07/2014 20:17]
Hypathie [Redirections et le pipe]
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [21/10/2015 19:19] (Version actuelle)
milou [Script bash : enchaînement de commandes et redirection]
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}}+  ​* Objet : Script bash : enchaînement de commandes et redirection 
 +  ​* Niveau requis : {{tag>​débutant ​avisé}} 
 +  * Commentaires : 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>​à-placer}} +  * Suivi :  
-    * Création par [[user>​Hypathie]] 18/​03/​2014 +    * Création par [[user>​Hypathie]] ​le 18/​03/​2014 
-    * Testé par <​Hypathiele <Juin 2014> +    * Testé par [[user>Hypathie]] ​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=142174#p142174 ​| 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**\\ +
-**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|modification de variable et de paramètre]]  +
-   +
-  * 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 !
 +
 +**Nota : Les autres wiki :**
 +  * [[doc:​programmation:​shells:​debuter-avec-les-scripts-shell-bash]]
 +  * [[doc:​programmation:​shells:​script-bash-variables-arguments-parametres|script-bash-variables-arguments-parametres]]
 +  * [[doc:​programmation:​shells:​script-bash-detail-sur-les-parametres-et-les-boucles|modification de variable et de paramètre]] ​
 +  * ;-)
 +  * [[doc:​programmation:​shells:​script-bash-etat-de-sorie-et-les-tests|script-bash-etat-de-sortie-et-les-tests]]
 +  * [[doc:​programmation:​shells:​tableaux|script-bash-les-tableaux]]
 +  * [[doc:​programmation:​shells:​fonction|script-bash-les-fonctions]]
 +
 +
  
 =====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 [[doc:programmation:​shells:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-controle|les opérateurs de contrôle]])\\
   * considérons maintenant :      * considérons maintenant :   
 <​code>​ <​code>​
Ligne 27: Ligne 30:
 </​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 : [[doc:​programmation:shells:​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. ​
 >Dans l'​exemple ci-dessus, chaque commande étant traitée par un sous-shell, ​ >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]],​+>le résultat d'une commande ne peut pas être conservée dans un même [[doc:programmation:​shells:​bash-les-differents-caracteres-speciaux?&#​notion-de-processus|processus]],​
 >afin que chaque commande puisse "​travailler"​ en rapport au résultat de la  >afin que chaque commande puisse "​travailler"​ en rapport au résultat de la 
 >​commande précédente. ​ >​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.) >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
 >​précédente commande a fonctionné. >​précédente commande a fonctionné.
->Voir [[atelier:chantier:​script-bash-etat-de-sorie-et-les-tests#​le-code-de-retour|code de retour]]. ​+>Voir [[doc:programmation:​shells:​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é.
 ===Exemple=== ===Exemple===
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 set -o posix set -o posix
Ligne 59: Ligne 61:
 </​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 76: Ligne 76:
 ==={ suite-de-commandes ;}=== ==={ suite-de-commandes ;}===
  
-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 [[doc:programmation:​shells:​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>​
  
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 { pwd ; cd ~/Documents ; echo $(pwd) ;} { pwd ; cd ~/Documents ; echo $(pwd) ;}
Ligne 93: Ligne 93:
  
 <​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 script>
 #!/bin/bash #!/bin/bash
 { pwd ; cd ~/Documents ; echo $(pwd) ;} & { pwd ; cd ~/Documents ; echo $(pwd) ;} &
Ligne 103: Ligne 103:
 /​home/​hypathie ​   /​home/​hypathie ​  
 </​code>​ </​code>​
-# le prompt ne revient pas il faut faire ctrl+c !+ 
 +> Le prompt ne revient pas il faut faire <​key>​C-c</​key> ​! 
 </​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 114: Ligne 116:
 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.\\ ​
  
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 nom=nenette nom=nenette
Ligne 129: Ligne 131:
 <note tip> <note tip>
 On ne confondra plus ! On ne confondra plus !
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 { var1=yep ;} { var1=yep ;}
Ligne 145: Ligne 147:
  
 Mais : Mais :
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 var1=coucou var1=coucou
Ligne 160: Ligne 162:
  
 ====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===
  
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 nom=nenette nom=nenette
Ligne 173: Ligne 175:
 </​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 190: Ligne 191:
 [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 ===
 Il est possible de lancer deux processus 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. 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>+<code bash script>
 #!/bin/bash #!/bin/bash
 ( echo "​bonjour"​ ) & ( echo "au revoir"​ ) ( echo "​bonjour"​ ) & ( echo "au revoir"​ )
Ligne 223: Ligne 224:
 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 =====
-  * Liste des opératieurs : [[atelier:chantier:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-redirection|un tableau des opérateurs de redirection]]+  * Liste des opératieurs : [[doc:programmation:​shells:​bash-les-differents-caracteres-speciaux#​les-operateurs-de-redirection|un tableau des opérateurs de redirection]]
   * Exercices dans le terminal, tout est là : [[doc:​programmation:​shell:​chevrons| les chevrons]]   * Exercices dans le terminal, tout est là : [[doc:​programmation:​shell:​chevrons| les chevrons]]
  
Ligne 335: Ligne 336:
 ===une solution=== ===une solution===
 Bonne lecture ;-) Bonne lecture ;-)
-<code bash>+<code bash script>
 #!/bin/bash #!/bin/bash
 set -o posix set -o posix
Ligne 366: Ligne 367:
  
 =====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]]+[[doc:programmation:​shells:​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.1404843459.txt.gz · Dernière modification: 08/07/2014 20:17 par Hypathie

Pied de page des forums

Propulsé par FluxBB