La portée d'une variable se limite au shell courant (ou à ses sous-processus si elle a été déclarée avec « export »). Le lancement d'un script induit le lancement d'un nouveau shell.
Autrement dit, si le script 2 définit une variable, celle-ci sera invisible pour le script 1 qui l'appelle... Sauf si tu invoques le script 2 avec « . » ou « source » : de cette façon, le code de script 2 est importé dans le shell courant (celui du script 1) au lieu d'être lancé dans un nouveau sous-shell. Démonstration :
Exemple 1
script1.sh :
#!/bin/sh
export TOTO="script1"
./test2.sh
echo $TOTO
script2.sh :
#!/bin/sh
export TOTO="script2"
On teste :
$ ./script1.sh
script 1
Effectivement, malgré le lancement de script2.sh, TOTO n'a pas été modifié.
Exemple 2
script1.sh :
#!/bin/sh
source script2.sh
echo $TOTO
script2.sh reste inchangé.
On reteste :
$ ./script1.sh
script 2
Cette fois, TOTO a été modifié par script2.sh.