Agence web » Actualités du digital » Comment définir des variables d'environnement dans Bash sous Linux

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

Il existe plusieurs types de variables d'environnement sous Linux. 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 le shell à l'intérieur, une collection de variables est référencée pour garantir que le shell est correctement configuré. Ces variables garantissent également que toute information à laquelle la fenêtre de terminal et le shell peuvent 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'apparence de l'invite de commande. Donc, naturellement, ils sont appelés 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 vus que par vous. D'autres ne peuvent pas référencer vos variables d'environnement de session. Il existe un troisième ensemble de variables d'environnement définies dans le shell. Vos paramètres régionaux, 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 des variables d'environnement du shell.

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 disponibles pour les processus enfants et pour les rendre persistants lors des redémarrages.

Environnements et héritage

Lorsqu'un shell démarre, il passe par une phase d'initialisation. C’est à ce stade 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 sera initialisé à partir de son propre ensemble de variables. Donc, si vous modifiez l'invite de commande dans le shell actuel, puis lancez un shell enfant, le shell enfant n'héritera pas de l'invite de commande modifiée du parent.

Variables d'environnement mondial

Par convention, les variables d'environnement reçoivent des noms en majuscules. Voici quelques-unes des variables d'environnement global et ce que les valeurs qu'elles contiennent représentent:

  • COQUILLE: Le nom du shell qui se lancera 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 défaut.
  • TERME: Les fenêtres de terminal sont en fait des émulations d'un terminal matériel. Cela contient le type de terminal matériel qui sera émulé.
  • UTILISATEUR: Le nom d'utilisateur de la personne actuelle utilisant le système.
  • PWD: 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 couleurs utilisés par le ls mettez en surbrillance différents types de fichiers.
  • COURRIER: Si la mailsystème a été configuré sur votre ordinateur Linux (par défaut, ce n’est pas le cas), cela conservera le chemin vers la boîte aux lettres de l’utilisateur actuel.
  • CHEMIN: Une liste de répertoires que le shell recherchera pour trouver les exécutables des commandes.
  • LANG: Les paramètres de langue, de localisation et d'encodage des caractères.
  • MAISON: Le répertoire personnel de l'utilisateur actuel.
  • _: Le trait de soulignement (_), la variable d'environnement contient la dernière commande saisie.

Nous pouvons voir ce que certains d'entre eux sont prêts à utiliser rien de plus sophistiqué que echo, qui écrira les valeurs dans la fenêtre du terminal. Pour voir le valeur détenu par une variable d'environnement, vous devez ajouter un signe dollar ($) au début de son nom.

Une bonne touche 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 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 le vôtre global variables d'environnement, ajoutez-les à la /etc/environment fichier. Vous devrez 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 que la variable d'environnement contienne. N'espacez pas avant ou après le signe égal (=). Le nom de la variable d'environnement peut contenir des lettres, un trait de soulignement (_) ou des nombres. Cependant, le premier caractère d'un nom ne peut pas être un nombre.

S'il y a des espaces dans la valeur, assurez-vous de placer la valeur entière entre guillemets (").

Enregistrez le fichier, puis déconnectez-vous et reconnectez-vous. Utilisation echo pour tester qu'une nouvelle variable existe et contient la valeur que vous définissez:

echo $WEBSITE

Parce que c'est une variable environnementale globale, accessible à tous, l'utilisateur mary peut référencer la variable d'environnement lors de sa prochaine connexion:

echo $WEBSITE

Pour voir toutes les variables d'environnement à la fois, tapez printenv. Il y a beaucoup de sortie, il est donc logique de la diriger sort, puis dans less:

printenv | sort | less

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

Nous pouvons diriger la sortie à travers grep pour rechercher des variables d'environnement liées à un sujet particulier.

printenv | grep GNOME

Variables d'environnement Shell

Ce sont quelques-unes des variables d'environnement shell utilisées dans bash pour dicter ou enregistrer son comportement et ses fonctionnalités. Certaines valeurs sont mises à jour lorsque vous utilisez le terminal. Par exemple, le COLUMNS La variable d'environnement sera mise à jour pour refléter les modifications 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 bash numéro de version sous forme de chaîne de mots et de chiffres.
  • BASH_VERSINFO: le bash version sous forme de chiffre.
  • COLONNES: La largeur actuelle de la fenêtre du terminal.
  • DIRSTACK: Les répertoires qui ont été ajoutés à la pile de répertoires par le pushd commander.
  • HISTFILESIZE: Nombre maximum de lignes autorisé dans le history fichier.
  • HISTSIZE: Nombre de lignes de history autorisé 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 sur la ligne de commande. Par défaut, c'est un espace.
  • PS1: le PS1 La variable d'environnement contient la définition de l'invite principale, par défaut et de la 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 plusieurs lignes et que d'autres entrées sont attendues, l'invite de commande secondaire s'affiche. le PS2 La variable d'environnement contient la définition de cette invite secondaire, qui, par défaut, est le signe supérieur à (>).
  • SHELLOPTS: Options de shell que vous pouvez définir à l'aide du set option.
  • UID: L'identifiant utilisateur de l'utilisateur actuel.

Voyons quelques-unes de ces variables shell:

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 d'invite de commandes:

  • t: L'heure actuelle, au format HH: MM: SS.
  • ré: La date actuelle, exprimée en jour de semaine, mois, date.
  • n: Un caractère de nouvelle ligne.
  • s: Le nom de votre coquille.
  • W: Le nom de votre répertoire de travail actuel.
  • w: Chemin d'accès à votre répertoire de travail actuel.
  • u: Nom d'utilisateur de la personne 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 le history liste.
  • $: Définit le dernier caractère de l'invite sur 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 nul, 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 .bashrc fichier. Si vous souhaitez que les variables d'environnement soient disponibles pour les sessions distantes, telles que les connexions SSH, vous devrez les ajouter à votre .bash_profile fichier, ainsi.

Le format de la définition de variable d'environnement est le même pour les deux fichiers. Pour ajouter une définition à votre .bash_profile fichier, 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 une fois la modification terminée. Vous pouvez vous déconnecter et vous reconnecter, ou vous pouvez faire relire le shell .bash_profile fichier à l'aide de la commande dot (.) comme ça:

. .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 la définition du INHERITED_VAR variable d'environnement avait le mot «export» au début de la 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 en utilisant bash , nous pouvons vérifier à nouveau les deux variables, depuis 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 n'est pas. Nous obtenons simplement une ligne vierge.

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

echo $INHERITED_VAR

Fermer notre enfant bash session, 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

Cela a été enregistré dans un fichier appelé envtest.sh, puis rendu exécutable avec les éléments suivants:

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 le WEBSITE variable d'environnement mondial et 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 nécessaire, nous pouvons exporter une variable d'environnement à partir de la ligne de commande. Nous ferons cela à notre LOCAL_VAR, puis réexécutez le script:

export LOCAL_VAR
./envtest.sh

La variable d'environnement a été ajoutée à l'environnement du shell actuel et apparaît donc dans l'environnement hérité par le script. Le script peut également référencer cette variable d'environnement.

Connexions à distance

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

(Au risque de prêter à confusion, il existe également un .profile fichier. Il peut également contenir des définitions de variables d'environnement. Cependant, le .profile le fichier n'est pas lu si le .bash_profile le fichier est présent. Donc, la chose la plus sûre à faire – et bash-compatible – consiste à utiliser le .bash_profile fichier.)

Pour modifier le .bash_profile fichier, nous utiliserons gedit encore:

gedit .bash_profile

Nous allons ajouter la même variable d'environnement avec la même valeur que nous avons utilisée auparavant.

Enregistrez vos modifications et fermez gedit.

Sur un autre ordinateur, nous ferons un SSH connexion à l'ordinateur de test.

ssh dave@howtogeek.local

Une fois que nous sommes connectés, nous exécutons à nouveau le script:

./envtest.sh

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

Désinstaller une variable d'environnement

Pour désactiver une variable d'environnement, utilisez le unset commander. Si nous désactivons la variable d'environnement global, WEBSITEet la variable d'environnement exportée, INHERITED_VAR, ils 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 global pour vous dans cette session. Une autre personne connectée simultanément pourra toujours accéder à son instance de cette variable d'environnement global. Son instance a été initialisée et lue dans le /etc/environment lors de son processus de connexion et est indépendant de la copie de la variable par quiconque.

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

echo $WEBSITE

Contrôle environnemental

Les variables d'environnement peuvent être utilisées pour informer les scripts et les applications de leur comportement. Ils peuvent être utilisés 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 à les écrire dans un fichier.

★★★★★