Problème
Prenons l'exemple du script suivant :
$ vi my_script.sh #!/bin/bash cd /home/toto/my_dir
L'objectif de ce script est simplement de changer de répertoire. Toutefois, lorsqu'on l'exécute au moyen de la commande "./script.sh", le changement de répertoire espéré ne se produit pas.
Solution
Chaque fois que vous exécutez un script sur votre shell de connexion, un nouveau sous-processus est créé et l'exécution du script se fait dans un sous-shell. Une fois le script terminé, le sous-shell sort et vous êtes renvoyé au shell de connexion. Ainsi, chaque fois que vous faites un cd dans un script, le répertoire est changé pour le chemin spécifié par cd, mais au moment où le script se termine, vous revenez à votre shell de connexion dans le répertoire de travail d'où vous avez commencé le script.
La façon de surmonter ce problème est d'utiliser :
$ source my_script.sh
Ce que fait source, c'est qu'il exécute le script comme un script TCL, c'est-à-dire qu'il a le même effet que si vous tapiez chaque ligne sur la ligne de commande de votre shell de connexion et qu'il était exécuté à partir de là. De cette façon, lorsque le script se termine après le cd, il reste dans ce répertoire.
On peut également utiliser la notation abrégée de source :
$ . my_script.sh