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
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
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"
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
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
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
La liste triée des variables d'environnement est affichée pour nous dans less
.
Nous pouvons faire passer la sortie par grep
pour rechercher les variables d'environnement liées à un sujet particulier.
printenv | grep GNOME
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
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
Nous avons ajouté une variable d'environnement appelée INHERITED_VAR
. Notez le mot "export"
au début de la ligne.
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
Maintenant, créons une variable d'environnement sur la ligne de commande :
LOCAL_VAR="This session only"
Si nous utilisons echo
, nous pouvons voir que les deux variables d'environnement nous sont accessibles :
echo $LOCAL_VAR
echo $INHERITED_VAR
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
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
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
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
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
Nous allons ajouter la même variable d'environnement avec la même valeur que celle utilisée précédemment.
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
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
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
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.