Comment définir des Variables d'Environnement dans Bash sous Linux ?

Par : TutorialsGrey, le 20 Décembre 2023

Il existe plusieurs types de variables d'environnement sous Linux. Dans ce tutoriel, vous apprenez à les voir, à les créer pour les connexions locales et distantes, et à les faire survivre aux redémarrages.

 

Fonctionnement des variables d'environnement

Lorsque vous lancez une fenêtre de terminal et l'interpréteur de commandes qui s'y trouve, une collection de variables est référencée pour s'assurer que l'interpréteur de commandes est configuré correctement. Ces variables garantissent également la disponibilité de toute information à laquelle la fenêtre du terminal et l'interpréteur de commandes pourraient avoir besoin de se référer. Collectivement, ces variables contiennent des paramètres qui définissent l'environnement que vous trouvez à l'intérieur de votre fenêtre de terminal, jusqu'à l'apparence de l'invite de commande. Elles sont donc naturellement appelées variables d'environnement.

Certaines variables d'environnement s'appliquent à l'ensemble du système, ou sont globales. D'autres sont propres à la session et ne peuvent être vues que par vous. D'autres encore ne peuvent pas faire référence aux variables d'environnement de votre session. Il existe un troisième ensemble de variables d'environnement définies dans l'interpréteur de commandes. Votre localisation, votre fuseau horaire, vos paramètres de clavier, l'ensemble des répertoires recherchés lorsque l'interpréteur de commandes tente de trouver une commande et votre éditeur par défaut sont tous stockés dans les variables d'environnement de l'interpréteur de commandes.

Nous allons vous montrer comment voir les variables d'environnement qui existent sur votre système, et nous décrirons comment créer les vôtres. Nous vous montrerons également comment les rendre accessibles aux processus enfants et comment les rendre persistantes lors des redémarrages.

 

Environnements et héritage

Lorsqu'un shell démarre, il passe par une phase d'initialisation. C'est à ce moment-là qu'il lit les variables d'environnement qui définissent l'environnement de l'interpréteur de commandes.

Lorsqu'un programme ou une commande est lancé à partir de cet interpréteur de commandes (appelé processus enfant), il hérite de l'environnement du processus parent, mais attention ! Comme nous le verrons, vous pouvez créer des variables qui ne seront pas ajoutées à votre environnement, de sorte qu'elles ne seront pas héritées par un processus enfant.

Si le processus enfant est un shell, ce dernier s'initialisera à partir de son propre jeu de variables. Ainsi, si vous modifiez l'invite de commande dans l'interpréteur de commandes actuel et que vous lancez ensuite un interpréteur de commandes enfant, ce dernier n'héritera pas de l'invite de commande modifiée du parent.

 

Variables d'environnement globales

Par convention, les variables d'environnement sont nommées en majuscules. Voici quelques-unes des variables d'environnement globales et ce que représentent les valeurs qu'elles contiennent :

  • SHELL : Le nom de l'interpréteur de commandes qui sera lancé lorsque vous ouvrirez une fenêtre de terminal. Sur la plupart des distributions Linux, il s'agit de bash, à moins que vous ne l'ayez modifié par rapport à la valeur par défaut.
  • TERM : Les fenêtres de terminal sont en fait des émulations d'un terminal matériel. Il s'agit du type de terminal matériel qui sera émulé.
  • USER : Le nom d'utilisateur de la personne qui utilise actuellement le système.
  • PWD : Le chemin d'accès au répertoire de travail actuel.
  • OLDPWD : Le répertoire dans lequel vous vous trouviez avant de passer au répertoire de travail actuel.
  • LS_COLORS : La liste des codes de couleur utilisés par ls pour mettre en évidence les différents types de fichiers.
  • MAIL : Si le système de messagerie a été configuré sur votre ordinateur Linux (ce qui n'est pas le cas par défaut), ce champ contiendra le chemin d'accès à la boîte email de l'utilisateur actuel.
  • PATH : Une liste de répertoires dans lesquels l'interpréteur de commandes cherchera les exécutables.
  • LANG : La langue, la localisation et les paramètres d'encodage des caractères.
  • HOME : Le répertoire home de l'utilisateur actuel.
  • _ : La variable d'environnement "underscore" (_) contient la dernière commande saisie.

Pour connaître la valeur de certaines d'entre elles, il suffit d'utiliser echo, qui écrit les valeurs dans la fenêtre du terminal. Pour connaître la valeur d'une variable d'environnement, vous devez ajouter un signe dollar ($) au début de son nom.

Il est également possible d'utiliser la touche Tab du clavier pour remplir le nom de la variable d'environnement à votre place. Tapez quelques lettres du nom et appuyez sur la touche Tab. Le nom de la variable est complété par l'interpréteur de commandes. Si ce n'est pas le cas, vous devrez taper quelques lettres supplémentaires pour distinguer la variable d'environnement des autres commandes dont le nom commence par ces mêmes lettres :

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

echo $SHELL dans un Terminal

 

Définir une variable d'environnement globale sous Linux

Pour créer vos propres variables d'environnement globales, ajoutez-les au fichier /etc/environment. Vous devez utiliser sudo pour éditer ce fichier :

sudo gedit /etc/environment

sudo gedit /etc/environment dan un Terminal

Pour ajouter une variable d'environnement, saisissez son nom, un signe égal (=) et la valeur que vous souhaitez lui attribuer. Ne mettez pas d'espace avant ou après le signe égal (=). Le nom de la variable d'environnement peut contenir des lettres, un underscore (_) ou des chiffres. Toutefois, le premier caractère d'un nom de variable ne peut pas être un chiffre.

Si la valeur contient des espaces, veillez à la mettre entre guillemets ("").

WEBSITE="Tutorials Grey"

Le fichier /etc/environment est ouvert dans un éditeur et une nouvelle variable d'environnement est ajoutée.

Enregistrez le fichier, puis déconnectez-vous et reconnectez-vous. Utilisez echo pour vérifier qu'une nouvelle variable existe et qu'elle contient la valeur que vous avez définie :

echo $WEBSITE

echo $WEBSITE dans le Terminal

Comme il s'agit d'une variable d'environnement globale, accessible à tous, l'utilisateur Anne peut faire référence à la variable d'environnement lors de sa prochaine connexion :

echo $WEBSITE

echo $WEBSITE dans le Terminal

Pour voir toutes les variables d'environnement en une seule fois, tapez printenv. Il y a beaucoup de données de sortie, il est donc logique de les faire passer par sort, puis par less :

printenv | sort | less

printenv | sort | less dans un Terminal

La liste triée des variables d'environnement est affichée pour nous dans less.

liste triée des variables d'environnement dans less dans un Terminal

Nous pouvons faire passer la sortie par grep pour rechercher les variables d'environnement liées à un sujet particulier.

printenv | grep GNOME

printenv | grep GNOME dans un Terminal

 

Variables d'environnement Bash utiles

Voici quelques-unes des variables d'environnement du shell utilisées dans bash pour dicter ou enregistrer son comportement et ses fonctionnalités. Certaines de ces valeurs sont mises à jour au fur et à mesure que vous utilisez le terminal. Par exemple, la variable d'environnement COLUMNS sera mise à jour pour refléter les changements que vous pourriez apporter à la largeur de la fenêtre du terminal :

  • BASHOPTS : Les options de ligne de commande utilisées lors du lancement de bash.
  • BASH_VERSION : Le numéro de version de bash sous la forme d'une chaîne de mots et de chiffres.
  • BASH_VERSINFO : La version de bash sous forme de chiffres.
  • COLUMNS : La largeur actuelle de la fenêtre du terminal.
  • DIRSTACK : Les répertoires qui ont été ajoutés à la pile de répertoires par la commande pushd.
  • HISTFILESIZE : Nombre maximum de lignes autorisées dans le fichier historique.
  • HISTSIZE : Nombre de lignes d'historique autorisées en mémoire.
  • HOSTNAME : Le nom d'hôte de l'ordinateur.
  • IFS : Séparateur de champ interne utilisé pour séparer les entrées de la ligne de commande. Par défaut, il s'agit d'un espace.
  • PS1 : La variable d'environnement PS1 contient la définition de l'invite principale, de l'invite par défaut et de l'invite de commande. Un ensemble de jetons appelés séquences d'échappement peut être inclus dans la définition de votre invite de commande. Ils représentent des éléments tels que l'hôte et le nom d'utilisateur, le répertoire de travail actuel et l'heure.
  • PS2 : Lorsqu'une commande s'étend sur plus d'une ligne et que des données supplémentaires sont attendues, l'invite de commande secondaire s'affiche. La variable d'environnement PS2 contient la définition de cette invite secondaire, qui, par défaut, est le signe plus grand que (>).
  • SHELLOPTS : Options de l'interpréteur de commandes que vous pouvez définir à l'aide de l'option set.
  • UID : L'identifiant de l'utilisateur actuel.

Examinons quelques-unes de ces variables de l'interpréteur de commandes :

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

echo $BASH_VERSION dans un Terminal

Par souci d'exhaustivité, voici les jetons que vous pouvez utiliser dans les définitions de l'invite de commande :

  • \t : L'heure actuelle, formatée en HH:MM:SS.
  • \d : La date actuelle, exprimée sous forme de jour de la semaine, mois, date.
  • \n : Un caractère de nouvelle ligne.
  • \s : Le nom de votre shell.
  • \W : Le nom de votre répertoire de travail actuel.
  • \w : Le chemin d'accès à votre répertoire de travail actuel.
  • \u : Le nom d'utilisateur de la personne connectée.
  • \h : Le nom d'hôte de l'ordinateur.
  • \N# : Chaque commande d'un interpréteur de commandes est numérotée. Cela vous permet de voir le numéro de la commande dans votre invite de commande. Ce numéro n'est pas le même que celui de la commande dans l'historique.
  • \$ : Définit le dernier caractère de l'invite de commande à un signe dollar ($) pour un utilisateur normal, et à un symbole dièse (#) pour l'utilisateur root. Cela fonctionne en vérifiant l'UID de l'utilisateur. S'il est égal à zéro, l'utilisateur est root.

Vous trouverez la définition de votre variable d'environnement PS1 dans votre fichier .bashrc.

Remarque : cette section traite spécifiquement de Bash, mais l'idée est la même dans d'autres shells, comme ZSH. Il y aura cependant des différences dans les variables de l'interpréteur de commandes.

 

Définir une variable d'environnement Bash

Pour créer des variables d'environnement pour votre propre usage, ajoutez-les à la fin de votre fichier .bashrc. Si vous souhaitez que les variables d'environnement soient accessibles aux sessions distantes, telles que les connexions SSH, vous devrez également les ajouter à votre fichier .bash_profile.

Le format de la définition de la variable d'environnement est le même pour les deux fichiers. Pour ajouter une définition à votre fichier .bash_profile, tapez ceci dans votre répertoire home :

gedit .bashrc

gedit .bashrc dans un Terminal

Nous avons ajouté une variable d'environnement appelée INHERITED_VAR. Notez le mot "export" au début de la ligne.

gedit .bashrc dans un Terminal

Enregistrez et fermez votre fichier après l'avoir modifié. Vous pouvez vous déconnecter et vous reconnecter, ou vous pouvez demander à l'interpréteur de commandes de relire le fichier .bash_profile en utilisant la commande point (.) comme ceci :

. .bashrc

. .bashrc dans un Terminal

Maintenant, créons une variable d'environnement sur la ligne de commande :

LOCAL_VAR="This session only"

Variable d'environnement sur une ligne de commande

Si nous utilisons echo, nous pouvons voir que les deux variables d'environnement nous sont accessibles :

echo $LOCAL_VAR
echo $INHERITED_VAR

echo $LOCAL_VAR dans un Terminal

Vous remarquerez que la définition de la variable d'environnement INHERITED_VAR contient le mot "export" au début de la ligne. Cela signifie que la variable d'environnement sera héritée par les processus enfants de l'interpréteur de commandes actuel. Si nous en lançons un autre à l'aide de la commande bash, nous pourrons à nouveau vérifier les deux variables à l'intérieur du shell enfant :

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

bash dans un Terminal

Comme vous pouvez le voir, INHERITED_VAR est accessible dans le shell enfant, mais LOCAL_VAR ne l'est pas. Nous obtenons simplement une ligne vide.

Bien que "export" ajoute la partie variable d'environnement à l'environnement dont héritent les processus enfants, INHERITED_VAR n'est pas une variable d'environnement globale. Par exemple, l'utilisateur Anne ne peut pas y faire référence :

echo $INHERITED_VAR

echo $INHERITED_VAR dans un Terminal

Pour fermer notre session bash enfant, nous utilisons exit :

exit

Les environnements hérités affectent également les scripts. Voici un script simple qui écrit les valeurs de nos trois variables d'environnement dans la fenêtre du terminal :

#!/bin/bas
echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Il a été enregistré dans un fichier appelé envtest.sh, puis rendu exécutable à l'aide de la commande suivante :

chmod +x envtest.sh

Lorsque nous exécutons le script, il peut accéder à deux des trois variables d'environnement :

./envtest.sh

./envtest.sh dans un Terminal

Le script peut voir la variable d'environnement globale WEBSITE et la variable d'environnement exportée INHERITED_VAR. Il ne peut pas accéder à LOCAL_VAR, même si le script s'exécute dans le même shell que celui où la variable a été créée.

Si nécessaire, nous pouvons exporter une variable d'environnement à partir de la ligne de commande. Nous allons le faire pour notre variable LOCAL_VAR, puis nous exécuterons à nouveau le script :

export LOCAL_VAR
./envtest.sh

export LOCAL_VAR dans un Terminal

La variable d'environnement a été ajoutée à l'environnement de l'interpréteur de commandes actuel et apparaît donc dans l'environnement hérité par le script. Le script peut également faire référence à cette variable d'environnement.

 

Connexions à distance

Les variables d'environnement globales sont accessibles aux sessions de connexion à distance, mais si vous voulez que vos variables d'environnement définies localement soient disponibles à distance, vous devez les ajouter à votre fichier .bash_profile. Vous pouvez définir la même variable d'environnement dans les fichiers .bashrc et .bash_profile, avec des valeurs différentes. Cela pourrait être pris en compte par un script, par exemple, pour modifier son comportement pour les personnes utilisant le système localement ou à distance.

(Au risque de brouiller les pistes, il existe également un fichier .profile. Il peut également contenir des définitions de variables d'environnement. Cependant, le fichier .profile n'est pas lu si le fichier .bash_profile est présent. Ainsi, la chose la plus sûre à faire - et la façon la plus conforme à bash - est d'utiliser le fichier .bash_profile).

Pour éditer le fichier .bash_profile, nous utiliserons à nouveau gedit :

gedit .bash_profile

gedit .bash_profile dans un Terminal

Nous allons ajouter la même variable d'environnement avec la même valeur que celle utilisée précédemment.

Le fichier .bash_profile ouvert dans un éditeur avec ajout d'une nouvelle variable d'environnement

Enregistrez vos modifications et fermez gedit.

Sur un autre ordinateur, nous allons établir une connexion SSH avec l'ordinateur test.

ssh dave@howtogeek.local

Une fois la connexion établie, nous exécuterons une nouvelle fois le script :

./envtest.sh

./envtest.sh dans un Terminal

Le fichier .bash_profile a été lu dans le cadre de l'initialisation de la connexion à distance, et la variable d'environnement INHERITED_VAR nous est accessible et au script.

 

Désactivation d'une variable d'environnement

Pour désactiver une variable d'environnement, utilisez la commande unset. Si nous désactivons la variable d'environnement globale WEBSITE, et la variable d'environnement exportée INHERITED_VAR, elles ne seront plus disponibles sur la ligne de commande, ni dans les processus enfants :

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

echo $WEBSITE dans un Terminal

Il convient de noter que cette opération ne modifie que la disponibilité des variables d'environnement globales pour vous dans cette session. Une autre personne connectée simultanément pourra toujours accéder à son instance de cette variable d'environnement globale. Son instance a été initialisée et lue à partir du fichier /etc/environment au cours de son processus de connexion, et elle est indépendante de la copie de la variable par une autre personne.

Par exemple, l'utilisateur Anne peut toujours accéder à la variable d'environnement WEBSITE et lire sa valeur, même si l'utilisateur Greyg l'a désactivée dans sa session :

echo $WEBSITE

echo $WEBSITE dans un Terminal

 

Contrôle de l'environnement

Les variables d'environnement peuvent être utilisées pour indiquer aux scripts et aux applications comment ils doivent se comporter. Elles peuvent être utilisées pour stocker des paramètres ou de petites quantités de données. Par exemple, un script peut remplir un environnement avec une valeur qui peut être référencée par d'autres scripts sans avoir à l'écrire dans un fichier.