<!--
  canonical-url: https://www.avonture.be/fr/blog/bash-load-env
  published:     2023-12-19
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# Bash - Charger des variables d'environnement depuis un fichier

> Apprenez à charger les variables d'environnement d'un fichier .env dans un script Bash, afin d'externaliser la configuration et de réutiliser les variables dans d'autres applications comme Laravel.

---
![Bash - Charger des variables d'environnement depuis un fichier](/img/v2/bash.webp)

**TL;DR**

Cet article montre la bonne façon de charger les variables d'un fichier `.env` dans l'environnement d'un script Bash : `set -o allexport; source .env; set +o allexport`. Cette méthode gère correctement les valeurs contenant des espaces — contrairement au pattern `export $(... | xargs)`, très répandu mais peu fiable.

Imaginez que vous ayez un fichier `.env` comme celui-ci et que vous souhaitiez le traiter dans un script Bash.

**.env**

```
DOCKER_GIT_USEREMAIL="christophe@me.com"
DOCKER_GIT_FULLNAME="Christophe Avonture"
DOCKER_GIT_USERNAME="Me and myself"
```

Utiliser un fichier de configuration vous permet d'externaliser la gestion de vos constantes, mais aussi de réutiliser les variables d'une autre application, par exemple un site développé en Laravel.

Voyons comment faire cela le plus proprement possible.

Le snippet provient de <https://gist.github.com/mihow/9c7f559807069a03e302605691f85572?permalink_comment_id=3954807#gistcomment-3954807>

Vous pouvez charger facilement ce fichier dans votre environnement avec les instructions suivantes :

```bash
set -o allexport
source .env
set +o allexport
```

Une fois ceci fait, les variables seront accessibles comme n'importe quelle variable d'environnement dans votre script bash. À la sortie du script, les variables ajoutées sont supprimées (exactement comme dans un sous-shell).

Utiliser source est la meilleure solution pour éviter les problèmes avec, par exemple, les espaces comme dans *Me and myself* : les autres solutions comme `export $(... | xargs)` donneront toujours des résultats imprévisibles.

Pour l'illustrer, créez simplement un fichier appelé par exemple `test.sh` avec ce contenu :

**test.sh**

```bash
#!/usr/bin/env bash

set -o allexport
source .env
set +o allexport

echo "${DOCKER_GIT_FULLNAME} (${DOCKER_GIT_USEREMAIL})"
```

Avec le fichier `.env` fourni plus haut, nous obtiendrons cette sortie :

```bash
$ ./test.sh
Christophe Avonture (christophe@me.com)
```

C'est, à mon avis, la meilleure et aussi la plus simple façon d'utiliser un fichier externe pour stocker des éléments de configuration en Bash.

Deux autres compagnons `.env` sur ce blog : [Compare environment files in the Linux console](/blog/compare-env-files-cli), pour repérer la clé que vous avez oublié de reporter depuis `.env.example`, et [Batch edit of environment file](/blog/update-env-files-cli), pour modifier la même variable dans une dizaine de projets d'un coup.
