Lors de l’utilisation de bash Shell, je garde parfois des variables d’environnement dans un fichier texte dont je copie/colle le contenu, par exemple exports.txt:
export FOO=bar
export FIZZ=buzz
Quelqu'un m'a montré au lieu de copier/coller, je pourrais taper dans le terminal
. exports.txt
qui aurait le même effet que copier/coller.
Quel est le mécanisme par lequel cette commande fonctionne? Il est difficile de penser à des termes de recherche.
Je veux comprendre ce qui se passe et les détails plus généraux de ce que fait ce one-line.
La commande .
("point") est un synonyme/raccourci pour la commande source
intégrée du shell.
Le script Shell nommé est alors lu et exécuté dans le contexte Shell actuel (plutôt que dans un sous-shell). Cela permet au script source de modifier l'environnement du shell appelant, par exemple en définissant des variables et en définissant des fonctions et des alias de shell.
Bien que les deux réponses existantes soient déjà excellentes, j'estime qu'il manque l'exemple où l'effet est le plus "perceptible".
Disons que j'ai un fichier script.sh
avec le contenu suivant:
cd dir
Si je voulais exécuter ce script normalement (sh script.sh
), je verrais ceci:
olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$
Mais si je source le script (. script.sh
), je finirais avec ceci:
olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$
Remarquez comment dans le second cas le répertoire de travail de notre shell principal a changé!
C'est parce que (comme indiqué dans les autres réponses), le premier exemple s'exécute dans son propre sous-shell (le processus sh
que nous commençons avec la commande sh
-, il aurait pu s'agir de n'importe quel shell, bash
, dash
, vous l'appelez), cela change de répertoire là-bas, ne fait rien et se ferme. Alors que le second exemple est exécuté dans notre shell principal, il change donc de répertoire!
Voici un exemple.
Fichier de script: mytest.sh
cat mytest.sh
#!/bin/bash
myvar=1
mystring="Hello World"
si vous essayez d'imprimer l'une des variables ci-dessus, vous n'obtiendrez rien
echo $myvar
mais si vous le faites
. mytest.sh
ou
source mytest.sh
et alors
echo $myvar
il va imprimer 1
Juste une réponse visuelle de ce que Spiff a écrit