Voila une illustration :
Le premier script affiche la valeur LANG, puis la date, puis appelle le second script.
Le second script affiche LANG, puis la date.
C'est garanti sans trucage! J'ai pas de cartes cachées dans ma poche, ou dans mon chapeau.
* Ma langue de base est l'anglais du Royaume Uni, avec un encodage UTF-8.
* les 2 cat sont la en témoin, pour montrer le contenu des scripts.
* Je lance ensuite mon premier test... qui s'effectue normalement, avec la valeur LANG incluse dans mon fichier de conf i18n.
... Pas de surprise, ma date s'affiche en anglais
* Je relance le script, en modifiant dynamiquement la variable. Et pouf, magie, la nouvelle valeur a été retransmise aux sous scripts.
* après exécution, je ré-affiche la valeur, qui est revenue à la normale, car ce code indique au shell de modifier uniquement la variable pour cette commande, puis de revenir à l'ancienne après :
VARIABLE=valeur ./mon_executable
* La valeur tig_ER.utf8 n'a été modifiée UNIQUEMENT pour CE script (et ses descendants)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| [root@dhcp-1-77 ~]# echo $LANG
en_GB.UTF-8
[root@dhcp-1-77 ~]# cat ./test.sh
#!/bin/bash
echo premier test
echo LANG=$LANG
date
./test2.sh
[root@dhcp-1-77 ~]# cat ./test2.sh
#!/bin/sh
echo "second script"
echo "LANG=$LANG"
date
[root@dhcp-1-77 ~]# ./test.sh
premier test
LANG=en_GB.UTF-8
Tue Feb 9 20:07:39 GMT 2010
second script
LANG=en_GB.UTF-8
Tue Feb 9 20:07:39 GMT 2010
[root@dhcp-1-77 ~]# LANG=tig_ER.utf8 ./test.sh
premier test
LANG=tig_ER.utf8
ታላሸኖ፡ ለካቲት 9 ዮም 8:07:43 ሓቆ ሰር ምዕል GMT 2010 ዓ/ም
second script
LANG=tig_ER.utf8
ታላሸኖ፡ ለካቲት 9 ዮም 8:07:43 ሓቆ ሰር ምዕል GMT 2010 ዓ/ም
[root@dhcp-1-77 ~]# echo $LANG
en_GB.UTF-8 |
Je voulais mettre le script de changement de langue dans un script à part, car ce code peut-être exécute à partir de différent script d'install. Je voulais factoriser, mais dans ce cas, ce n'est pas possible.
Si je comprends bien, si je veux que l'environnement modifié soit propagé à tous les scripts, je dois mettre le script de modif de la langue dans le script principale qui appelle tous les autres.
Effectivement, c'est bien ça, tu as tout à fait compris la situation.
en exécutant un script, tu crées un sous environnement qui va certes modifier la variable dans lui-même... mais pas dans son parent.
C'est ce que j'appelle le syndrome du génial programme `cd` :
un type créer un programme qui fait l'équivalent de `cd` et il devient fou car cela ne fonctionne pas.
===================================================
partie 2 :
Maintenant, il y a un truc, important : le sourcing
la commande source (ou . [un point]) permet de lire un fichier dans le même contexte d'exécution, et la il devient possible de modifier une valeur dans le contexte courant (mais pas le contexte parent, bien entendu).
Voila un exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| [root@dhcp-1-77 ~]# cat test3.sh
#!/bin/bash
echo tentative de modification 1
LANG=ur_PK.utf8
echo "LANG=$LANG"
[root@dhcp-1-77 ~]# cat test4.sh
echo tentative de modification 2
LANG=ur_PK.utf8
echo "LANG=$LANG"
[root@dhcp-1-77 ~]# echo $LANG
en_GB.UTF-8
[root@dhcp-1-77 ~]# ./test3.sh
tentative de modification 1
LANG=ur_PK.utf8
[root@dhcp-1-77 ~]# echo $LANG
en_GB.UTF-8
[root@dhcp-1-77 ~]# source ./test4.sh
tentative de modification 2
LANG=ur_PK.utf8
[root@dhcp-1-77 ~]# echo $LANG
ur_PK.utf8
[root@dhcp-1-77 ~]# date
منگل فروري 9 20:31:55 GMT 2010
[root@dhcp-1-77 ~]# source /etc/sysconfig/i18n
[root@dhcp-1-77 ~]# echo $LANG
en_GB.UTF-8
[root@dhcp-1-77 ~]# date
Tue Feb 9 20:32:09 GMT 2010 |
![:ccool:](https://www.developpez.net/forums/images/smilies/ccool.gif)
A noter :- La shebang line (#!/bin/sh) n'a ici plus de raison d'être, puisqu'il n'y a pas de possibilité de choix de contexte (on reste dans le même contexte, un point c'est tout)
- Comme il n'y a pas "execution" au sens Unix du terme, il n'y a pas besoin des droit d'exécution, seulement les droit de lecture
- Bien entendu, la commande source n'est pas un programme, mais une commande builtin de shell, tout comme cd
- Les langues arabiques semblent commencer par l'heure avant de mettre la date
![:roll:](https://www.developpez.net/forums/images/smilies/icon_rolleyes.gif)
Partager