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 [06/06/2014 07:24] Hypathie [Enchaînements de commandes dans les scripts] |
doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie [06/06/2014 09:08] Hypathie [Enchaînements de commandes dans les scripts] |
||
---|---|---|---|
Ligne 94: | Ligne 94: | ||
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 100: | 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]] | ||
+ | |||
+ | <note tip> | ||
+ | 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: ligne6: 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 ==== | ====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 === | ===Lancer deux sous-shell en parallèle === | ||
+ | Il est possible de lancer deux processus en parallèle. | ||
+ | |||
+ | <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> | ||
+ | Comparez le retour. | ||
+ | |||
+ | ====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===== | =====Redirections et le pipe dans les scripts===== | ||
* À voir : | * À voir : |