web-dev-qa-db-fra.com

Que fait la commande 'nom du fichier d'espace' dans bash?

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.

30
iancoleman

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.

40
Spiff

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!

26
Olle Kelderman

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

4
raism