abbassi chifa
unread,Jun 26, 2011, 6:41:32 AM6/26/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to ENSI_LPI2011
Il est possible d’exécuter des commandes dans un sous-shell sans
passer par un script. En effet, là où une
commande (ou une suite de commandes) est admise, on peut écrire la
construction spéciale :
(commande)
où commande peut être n’importe quelle suite de commandes.
Cette construction a les mêmes caractéristiques qu’un bloc formé par
des accolades, à ceci près que la com-
mande sera exécutée dans un sous-shell, alors qu’un bloc ne provoque
pas de création d’un sous-shell. Tout
comme un bloc, le sous-shell créé pour exécuter commande dispose de
ses propres entrées/sorties qui peuvent
être redirigées.
Ce qui distingue un bloc d’un sous-shell est que le sous-shell dispose
de son propre environnement. À sa
création, il hérite d’une copie totale 1 de l’environnement de son
père.
- C’est une différence notable avec les processus créés pour exécuter
une commande (ou un script)
qui n’héritent pas d’une copie des variables locales ou des alias du
père.
Disposant de son propre environnement, toute modification du
répertoire de travail et toute création/modification
de variables (y compris d’environnement), de fonctions ou d’alias
opérée dans un sous-shell n’a aucune incidence
sur l’environnement du père qui reste inchangé.
i Les sous-shells créés pour la substitution de commande, ainsi que
les commandes
lancées en tâche de fond disposent aussi d’une copie totale de
l’environnement de leur père.
L’utilisation des sous-shells créés avec les parenthèses est assez
marginale et n’a de sens que si on souhaite
exécuter du code qui modifie l’environnement, alors que l’on ne veut
pas modifier l’environnement du shell
courant
Exemples :
$ tab=(un deux trois)
$ var=blablabla
$ function ecrire { echo "($1) tab: ${tab[*]} et var : $var"; }
$ (ecrire fils) ; ecrire pere
(fils) tab: un deux trois et var: blablabla
(pere) tab: un deux trois et var: blablabla
ê on voit que le fils "connaît" le tableau tab, la variable var et la
fonction ecrire
$ (var=xxxx ; ecrire fils) ; ecrire pere
(fils) tab: un deux trois et var: xxxx
(pere) tab: un deux trois et var: blablabla
ê on voit que la modification de var par le fils n’est effective que
pour ce dernier
$ export IFS
$ (IFS=’,’ ; var=xxxx ; ecrire fils) ; ecrire pere
(fils) tab: un,deux,trois et var: xxxx
(pere) tab: un deux trois et var: blablabla
ê on voit que même si IFS est rendue d’environnement, sa modification
dans le fils n’affecte pas le
père.