Comment exporter des variables d'un fichier?

80

J'ai un tmp.txtfichier contenant des variables à exporter, par exemple:

a=123
b="hello world"
c="one more variable"

Comment puis-je exporter toutes ces variables à l'aide de la exportcommande, afin qu'elles puissent ensuite être utilisées par des processus enfants?

Neerav
la source
1
bash --init-file somefile.blah -c "commande"
Dillian Murphey
SO a une réponse utile sur la façon de créer automatiquement des .envfichiers lorsque vous entrez cddans un répertoire.
Dan Dascalescu
@ Neerav S'il vous plaît accepter l'autre réponse. C'est une bien meilleure solution.
coderDude

Réponses:

65
source tmp.txt
export a b c
./child ...

À en juger par votre autre question, vous ne voulez pas coder en dur les noms de variables:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

Essaye-le:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
Glenn Jackman
la source
2
Cela ne fonctionnera pas si le fichier d’environnement contient des commentaires, par exemple. (par exemple, les fichiers pouvant être réutilisés par EnvironmentFile de systemd)
Chris Lamb
3
@ChrisLamb vous pouvez utiliser greppour ignorer les commentaires:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
Gvee
182
set -a
. ./tmp.txt
set +a

set -afait que les variables¹ définies désormais soient automatiquement exportées. Il est disponible dans n'importe quel shell Bourne-like. .est le nom standard et Bourne pour la sourcecommande, donc je la préfère pour la portabilité ( sourcevient de cshet est maintenant disponible dans la plupart des shells Bourne-like modernes, même bashsi (avec parfois un comportement légèrement différent)).

Dans les shells POSIX, vous pouvez également utiliser set -o allexportune méthode alternative plus descriptive pour l'écrire ( set +o allexportpour le désactiver).


¹ Dans In bash, sachez que toutes les fonctions déclarées pendant allexportleur activation sont également exportées vers l'environnement (car BASH_FUNC_myfunction%%les variables d'environnement importées par tous les bashshells s'exécutent dans cet environnement, même lorsqu'elles s'exécutent en tant que sh).

Stéphane Chazelas
la source
1

Il suffit de faire:

while read LINE; do export "$LINE"; done < ./tmp.txt
Benjamin Berhault
la source
Avez-vous vérifié si cela fonctionne?
RalfFriedl
@RalfFriedl cela devrait fonctionner, pourquoi pas? Ce n’est pas très élégant et le sourcing set -aserait beaucoup plus simple, mais cela fonctionne réellement.
terdon
C'est cassant. Il n'autorise pas les commentaires dans le fichier d'entrée, ne gère pas correctement les valeurs de variable citées et échoue pour les variables multilignes. Certes, je n'ai pas beaucoup de variables multilignes, mais j'utilise des commentaires régulièrement et j'ai souvent besoin d'utiliser des guillemets pour les valeurs de variables.
Louis
Cela a fonctionné pour moi.
Mchawre