Comment définir des variables d’environnement dans Bash sous Linux

  • par

  • Dave McKay

    @TheGurkha

  • Le 28 avril 2020, 8 :00am EDT
Un terminal Linux stylisé avec des lignes de texte vertes sur un ordinateur portable.
fatmawati achmad zaenuri/

Il existe plus d’un type de variable d’environnement sous Linux. Apprenez à les voir, à les créer pour les connexions locales et distantes, et à leur faire survivre aux redémarrages.

Comment fonctionnent les variables d’environnement

Lorsque vous lancez une fenêtre de terminal et le shell à l’intérieur, une collection de variables est référencée pour s’assurer que le shell est configuré correctement. Ces variables garantissent également que toute information à laquelle la fenêtre de terminal et le shell pourraient avoir besoin de se référer est disponible. Collectivement, ces variables contiennent des paramètres qui définissent l’environnement que vous trouvez dans votre fenêtre de terminal, jusqu’à l’aspect de l’invite de commande. Donc, naturellement, on les appelle des variables d’environnement.

Certaines variables d’environnement sont à l’échelle du système, ou globales. D’autres sont à l’échelle de la session et ne peuvent être vues que par vous. D’autres ne peuvent pas faire référence à vos variables d’environnement de session. Il existe un troisième ensemble de variables d’environnement définies au sein du shell. Vos paramètres de locale, de fuseau horaire et de clavier, l’ensemble des répertoires recherchés lorsque le shell essaie de trouver une commande, et votre éditeur par défaut, sont tous stockés dans les variables d’environnement du shell.

Publicité

Nous allons vous montrer comment voir les variables d’environnement qui existent sur votre système, et nous allons décrire comment créer les vôtres. Nous vous montrerons également comment les rendre disponibles pour les processus enfants et pour qu’elles soient 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 qu’il lit les variables d’environnement qui définissent l’environnement du shell.

Lorsqu’un programme ou une commande est lancé à partir de ce shell – 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 sont 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 shell s’initialise à partir de son propre ensemble de variables, fraîches. Ainsi, si vous modifiez l’invite de commande dans le shell actuel, puis lancez un shell 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 reçoivent des noms en majuscules. Voici quelques-unes des variables d’environnement globales, et ce que représentent les valeurs qu’elles contiennent :

  • SHELL : le nom du shell qui sera lancé lorsque vous ouvrirez une fenêtre de terminal. Sur la plupart des distributions Linux, ce sera 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. Cela détient le type de terminal matériel qui sera émulé.
  • USER : Le nom d’utilisateur de la personne actuelle utilisant le système.
  • PWD : Le chemin d’accès au répertoire de travail actuel.
  • OLDPWD : Le répertoire dans lequel vous étiez avant de vous déplacer vers le répertoire de travail actuel.
  • LS_COLORS : La liste des codes de couleur utilisés par le ls pour mettre en évidence les différents types de fichiers.
  • Mail : Si le mailsystème a été configuré sur votre ordinateur Linux (par défaut, il ne l’est pas), cela contiendra le chemin d’accès à la boîte aux lettres de l’utilisateur actuel.
  • PATH : Une liste de répertoires que le shell parcourra pour trouver les exécutables des commandes.
  • LANG : Les paramètres de langue, de localisation et de codage des caractères.
  • HOME : Le répertoire d’origine de l’utilisateur actuel.
  • _ : La variable d’environnement underscore (_) détient la dernière commande qui a été tapée.

RELATED : Comment utiliser pushd et popd sur Linux

Publicité

Nous pouvons voir à quoi certaines d’entre elles sont définies en n’utilisant rien de plus sophistiqué que echo, qui écrira les valeurs dans la fenêtre du terminal. Pour voir la valeur détenue par une variable d’environnement, vous devez ajouter un signe dollar ($) au début de son nom.

Une touche agréable est que vous pouvez utiliser la complétion de tabulation pour remplir le nom de la variable d’environnement pour vous. Tapez quelques lettres du nom et appuyez sur la touche Tab. Le nom de la variable est complété par le shell. Si cela ne se produit pas, 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 une fenêtre de terminal

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

sudo gedit /etc/environment

sudo gedit /etc/environnement dans une fenêtre de terminal

Publicité

Pour ajouter une variable d’environnement, tapez son nom, un signe égal (=), et la valeur que vous voulez que la variable d’environnement contienne. N’utilisez pas d’espace avant ou après le signe égal (=). Le nom de la variable d’environnement peut contenir des lettres, un trait de soulignement (_) ou des chiffres. Toutefois, le premier caractère d’un nom ne peut pas être un chiffre.

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

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

Enregistrez le fichier, puis déconnectez-vous et reconnectez-vous. Utilisez echo pour tester qu’une nouvelle variable existe et conserve la valeur que vous avez définie :

echo $WEBSITE

echo $WEBSITE dans une fenêtre de terminal.

Parce que c’est une variable d’environnement globale, et disponible pour tout le monde, l’utilisateur mary peut faire référence à la variable d’environnement lors de sa prochaine connexion :

echo $WEBSITE

echo $WEBSITE dans une fenêtre de terminal.

Publicité

Pour voir toutes les variables d’environnement en même temps, tapez printenv. Il y a beaucoup de sortie, il est donc logique de la faire passer par sort, puis dans less:

printenv | sort | less

imprimertenv | sort | less dans une fenêtre de terminal.

La liste triée des variables d’environnement s’affiche pour nous dans less.

liste triée des variables d'environnement dans less dans une fenêtre de 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 une fenêtre de terminal.

RELATED : Comment éditer des fichiers texte graphiquement sous Linux avec gedit

Variables d’environnement du shell

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 qui ont été utilisées lorsque bash a été lancé.
  • BASH_VERSION : Le numéro de version de bash sous la forme d’une chaîne de mots et de chiffres.
  • BASH_VERSINFO : La bash version sous forme de chiffre.
  • COLUMES : 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 pushd commande.
  • HISTFILESIZE : Nombre maximal de lignes autorisées dans le fichier history.
  • HISTSIZE : Nombre de lignes de history autorisées en mémoire.
  • HOSTNAME : Le nom d’hôte de l’ordinateur.
  • IFS : Le séparateur de champ interne utilisé pour séparer les entrées sur 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, par défaut et 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 qu’une entrée supplémentaire est attendue, l’invite de commande secondaire est affichée. La variable d’environnement PS2 détient la définition de cette invite secondaire qui, par défaut, est le signe supérieur à (>).
  • SHELLOPTS : Les options du shell que vous pouvez définir à l’aide de l’option set.
  • UID : L’identifiant de l’utilisateur actuel.

RELATED : Comment utiliser pushd et popd sous Linux

Vérifions quelques-unes de ces variables shell :

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

echo $BASH_VERSION dans une fenêtre de terminal.

Publicité

Pour être complet, voici les jetons que vous pouvez utiliser dans les définitions de l’invite de commande :

  • \t : L’heure actuelle, formatée sous la forme 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 qui s’est connectée.
  • \h : Le nom d’hôte de l’ordinateur.
  • \# : Chaque commande dans un shell est numérotée. Cela vous permet de voir le numéro de la commande dans votre invite de commande. Ce n’est pas le même que le numéro que la commande aura dans la history liste.
  • \$ : Définit le caractère final de l’invite à un signe dollar ($) pour un utilisateur régulier, et un symbole de hachage (#) 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 PS1 variable d’environnement dans votre .bashrc fichier.

Création de variables d’environnement de session

Pour créer des variables d’environnement pour votre propre usage, ajoutez-les au bas de votre fichier .bashrc. Si vous souhaitez que les variables d’environnement soient disponibles pour les sessions distantes, comme les connexions SSH, vous devrez également les ajouter à votre fichier .bash_profile.

Le format de la définition des variables 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 personnel :

gedit .bashrc

.Le fichier bashrc loda dans un éditeur et une nouvelle variable d'environnement ajoutée comme dernière ligne du fichier.

Publicité

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

gedit .bashrc dans une fenêtre de terminal.

Enregistrez et fermez votre fichier après avoir terminé l’édition. Vous pourriez vous déconnecter et vous reconnecter, ou vous pouvez faire en sorte que le shell relise le fichier .bash_profile en utilisant la commande dot (.) comme ceci:

. .bashrc

. .bashrc dans une fenêtre de terminal.

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

LOCAL_VAR="This session only"

LOCAL_VAL="Cette session seulement" dans une fenêtre de terminal."This session only" in a terminal window.

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 une fenêtre de terminal.

Publicité

Vous aurez remarqué que la définition de la variable d’environnement INHERITED_VAR comportait le mot « export » en début de ligne. Cela signifie que la variable d’environnement sera héritée par les processus enfants du shell actuel. Si nous en lançons un autre à l’aide de la commande bash, nous pourrons vérifier à nouveau les deux variables, depuis l’intérieur du shell enfant :

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

bash dans une fenêtre de terminal

Comme vous pouvez le constater, la 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 mary ne peut pas la référencer :

echo $INHERITED_VAR

echo $INHERITED_VAR dans une fenêtre de 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/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Publicité

Ce script a été enregistré dans un fichier appelé envtest.sh, puis rendu exécutable avec ce qui suit :

chmod +x envtest.sh

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

./envtest.sh

./envtest.sh dans une fenêtre de terminal.

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

Si nous en avons besoin, nous pouvons exporter une variable d’environnement depuis la ligne de commande. C’est ce que nous allons faire à notre LOCAL_VAR, puis nous exécuterons à nouveau le script :

export LOCAL_VAR
./envtest.sh

exporter LOCAL_VAR dans une fenêtre de terminal.

Publicité

La variable d’environnement a été ajoutée à l’environnement du shell courant, et elle apparaît donc dans l’environnement dont hérite 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 .bash_profile fichier. 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 capté 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 aussi un fichier .profile. Il peut contenir des définitions de variables d’environnement, également. 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 manière bash conforme – est d’utiliser le fichier .bash_profile.)

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

gedit .bash_profile

gedit .bash_profile dans une fenêtre de 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 une nouvelle variable d'environnement ajoutée.

Enregistrez vos modifications et fermez gedit.

Publicité

Sur un autre ordinateur, nous allons établir une SSH connexion à l’ordinateur de test.

ssh [email protected]

ssh dave@howtogeek.local dans une fenêtre de terminal.

Une fois que nous sommes connectés, nous allons exécuter le script une fois de plus :

./envtest.sh

./envtest.sh dans une fenêtre de terminal.

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

Désactiver 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

Négociation d'une variable d'environnement sur Bash sous Linux.

Un point à noter est que cela ne change que la disponibilité des variables d’environnement globales pour vous dans cette session. Une autre personne qui est 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 pendant son processus de connexion, et est indépendante de la copie de la variable de toute autre personne.

Publicité

À titre d’exemple, l’utilisateur mary peut toujours accéder à la variable d’environnement WEBSITE et lire sa valeur, même si l’utilisateur dave l’a unset dans sa session :

echo $WEBSITE

écho %WEBSITE dans une fenêtre de 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 alimenter un environnement avec une valeur qui peut être référencée par d’autres scripts sans avoir à les écrire dans un fichier.

Dave McKay
Dave McKay a d’abord utilisé des ordinateurs lorsque la bande de papier perforé était en vogue, et il n’a jamais cessé de programmer depuis. Après plus de 30 ans dans l’industrie informatique, il est maintenant journaliste technologique à plein temps. Au cours de sa carrière, il a travaillé comme programmeur indépendant, responsable d’une équipe internationale de développement de logiciels, chef de projet de services informatiques et, plus récemment, comme responsable de la protection des données. Dave est un évangéliste de Linux et un défenseur de l’open source.Read Full Bio  »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *