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.
help .
C'est tellement court que le moteur Stack Exchange pense qu'il est trop court pour être un commentaire.'. ' 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)..
issource
, qui signifie littéralement "commandes source à partir de ce fichier", du moins pour moi.Réponses:
La commande
.
("dot") est un synonyme / raccourci de lasource
commande 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.
la source
source
s'agit d'un synonyme / raccourci non standard et non portable pour la commande "dot" ( ) définie par POSIX.
, et non l'inverse.source
et 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 nonsource
. Dans aucun des deux modes n'estsource
synonyme de la.
commande POSIX .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.sh
avec le contenu suivant:Si je voulais exécuter ce script normalement (
sh script.sh
), je verrais ceci:Mais si je trouve le script (
. script.sh
), je me retrouverais avec ceci: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
sh
processus , nous commençons par lesh
-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!la source
Voici un exemple.
Fichier de script: mytest.sh
si vous essayez d'imprimer l'une des variables ci-dessus, vous n'obtiendrez rien
mais si tu le fais
ou
et alors
il imprimera 1
Juste une réponse visuelle de ce que Spiff a écrit
la source
export
n'est que si ces variables doivent être utilisées dans des sous-coquilles. Je pourrais omettreexport
dans le fichier si les variables ne doivent être utilisées que dans le shell actuel. Est-ce correct?