Que fait la commande 'dot space filename' dans bash?

30

Lorsque j'utilise 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 pouvais taper dans le terminal

. exports.txt

ce qui aurait le même effet que copier / coller.

Quel est le mécanisme par lequel cette commande 'dot space filename' fonctionne? Il est difficile de penser à des termes de recherche pour cela.

Je veux comprendre ce qui se passe et les détails plus généraux de ce que fait ce monoplace.

iancoleman
la source
23
Run help . C'est tellement court que le moteur Stack Exchange pense qu'il est trop court pour être un commentaire.
Wildcard
5
Je me demande pourquoi toutes ces questions se posent également sur ce site. Ils ont reçu de nombreuses réponses dans Stack Overflow , Ask Ubuntu et Unix & Linux .
fedorqui
Pour exécuter un espace point, vous devez taper '. ' args, avec des guillemets simples ou doubles. Sinon, l'espace non cité est consommé par bash quand il analyse la ligne en jetons (voir "séparation des mots" dans le manuel de bash).
Peter Cordes
1
En bash, un autre nom pour .is source, qui signifie littéralement "commandes source à partir de ce fichier", du moins pour moi.
jpaugh

Réponses:

40

La commande .("dot") est un synonyme / raccourci de la sourcecommande intégrée du shell .

Il provoque la lecture et l'exécution du script shell nommé dans le contexte shell actuel (plutôt que sous-shell). Cela permet au script d'origine de modifier l'environnement du shell appelant, comme la définition de variables et la définition de fonctions et d'alias de shell.

Spiff
la source
49
En fait, il sources'agit d'un synonyme / raccourci non standard et non portable pour la commande "dot" ( ) définie par POSIX. , et non l'inverse.
terdon
8
bash fournit un non-standard sourceet un non-standard .en mode non-POSIX, qui recherchent tous les deux le répertoire courant même s'il n'en fait pas partie $PATH. En mode POSIX, il fournit un standard .qui ne recherche pas le répertoire courant, et non source. Dans aucun des deux modes n'est sourcesynonyme de la .commande POSIX .
hvd
26

Bien que les deux réponses existantes soient déjà excellentes, je pense que l'exemple où l'effet est le plus "perceptible" pour ainsi dire, manque.

Disons que j'ai un fichier script.shavec 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 trouve le script ( . script.sh), je me retrouverais 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é!

En effet , (comme en pointe dans les autres réponses) les premières courses par exemple dans son propre sous - shell (le shprocessus , nous commençons par le sh-command, cela aurait pu être essentiellement une coquille, bash, dash, vous le nom), il change là annuaire, ne fait rien et ferme. Alors que le deuxième exemple s'exécute dans notre shell principal, et change donc de répertoire là-bas!

Olle Kelderman
la source
4

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 tu le fais

. mytest.sh

ou

source mytest.sh

et alors

echo $myvar

il imprimera 1

Juste une réponse visuelle de ce que Spiff a écrit

raisin
la source
Donc, pour interpréter votre exemple, utiliser exportn'est que si ces variables doivent être utilisées dans des sous-coquilles. Je pourrais omettre exportdans le fichier si les variables ne doivent être utilisées que dans le shell actuel. Est-ce correct?
iancoleman
1
Tout à fait raison et je pourrais dire oui. Cependant, l'utilisation de la commande d'exportation est plus utile ou plus compréhensible si vous pensez aux variables d'environnement du shell. Par exemple $ HOME ou $ DISPLAY. Oui, vous pouvez utiliser la commande d'exportation pour exporter une variable sur votre session shell ou sur n'importe quel sous-shell, mais elle disparaîtra dès que vous terminerez cette session.
raism