- Dave McKay
@TheGurkha
- Le 28 avril 2020, 8 :00am EDT
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.
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
mail
systè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
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
.
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
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 ("
).
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
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
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
La liste triée des variables d’environnement s’affiche 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
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
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
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 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
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 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
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
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
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
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
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
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 SSH
connexion à l’ordinateur de test.
ssh [email protected]
Une fois que nous sommes connectés, nous allons exécuter le script une fois de plus :
./envtest.sh
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
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.
À 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
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 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 »