Outils pour utilisateurs

Outils du site


cours:informatique:fun_mooc:maitrise_du_bash_univ-reunion:310_variables_et_environnement

Bash: Gestion des variables et de l'environnement

Sous Unix il existe deux catégories de variable: Les variables utilisateurs (internes) et les variables d’environnement. Les variables utilisateurs ne sont valables que dans l’instance actuelle du shell. Elles sont utilisées pour modifier à court terme le comportement du shell. Les variables d’environnement sont valides pour toutes les sessions du shell et transmises aux processus fils. Par convention le nom des variables d’environnement est en lettres capitales.

Les variables d'environnement sont relatives à l'utilisateur et à la session. Elle ne peuvent être exploitées que dans la session courante. Elle sont initialisées par le shell à la connexion de l'utilisateur mais peuvent être altérées.

Les modifications de l'environnement et des options du bash influenceront le comportement du shell et des programmes.

Définition de variables

Par simple affectation label=valeur, on peut définir une variable interne de type chaîne de caractères:

# Attention pas d'espaces entre le nom de variable
# le symbole d'affectation '=' et la valeur
mavar="hello bash"

La primitive declare permet de définir une variable en spécifiant des attributs particuliers comme la lecture seule ou la déclaration d'un type spécifique comme entier, tableau associatif ou indexé.

La primitive typeset est un synonyme de declare. On peut utiliser indifféremment ces mnémoniques.
# Forme générale:
# declare option label_variable=value
 
# Création d'une variable de type tableau (array)
declare -a tab=(10 20 30 40)
 
# Récupère un élément via l'index, attention les index sont numérotés 
# en partant de 0. L'index 3 correspond donc au 4ième élément du tableau 
echo ${tab[3]}
40
 
echo ${tab[*]}
10 20 30 40
 
# Equivalent de declare: typeset
# ici avec l'option -i pour créer une variable dont la valeur est entière
typeset -i number
 
# calcul sur des variables de type entier
number=33
number=number+3
 
echo $number
36

La primitive readonly permet de définir ou de lister les variables et les fonctions en lecture seule:

# La variable mavar3 ne sera plus modifiable
readonly mavar3
Lorsque une variable est définie en lecture seule, elle ne peut plus être modifiée ou supprimée dans le shell courant ou les sous processus. En cas d'erreur, une possibilité est de remplacer le shell courant via la commande
exec "$0" "$@"
La primitive local permet de définir des variables dont la portée est limitée à l'intérieur d'une fonction; elles ne sont visibles que dans les fonctions où elles ont été définies et dans leurs fonctions filles.

Utilisation des variables

Pour accèder à la valeur d'une variable, on préfixe le label de la variable avec $. Notons également les syntaxes suivantes:

${#var} Taille (en caractères) de la variable var
${#var[*]} Nombre d'éléments de la variable var (taille du tableau)
${var:-default_value} valeur de la variable var si elle existe, “default_value” sinon
${var:=default_value} valeur de la variable var si elle existe, affecte “default_value” à la variable var sinon

Supprimer une variable

La primitive unset supprime une variable de l’environnement a condition bien sûr que celle-ci ne soit pas en lecture seule:

# supprimer la définition de la variable mavar
unset -v mavar
 
# supprimer la définition de la fonction ma_fonction
unset -f ma_fonction

Afficher les variables d’environnement

Pour lister les variables d'environnement:

# Affiche l'ensemble des variables d'environnement
printenv
 
# Equivalent
env
 
# Afficher la valeur d'une variable en particulier
printenv TERM
screen.xterm-256color

La variable PATH permet au shell de retrouver les commandes du système sans qu'il soit nécessaire de fournir le chemin absolu. Elle contient la liste ordonnée des répertoires à parcourir pour trouver une commande. Si plusieurs versions d'une même commande existe, c'est celle trouvée dans le premier répertoire de la liste qui sera invoquée.

Exporter les variables internes

Une variable créée par l’utilisateur dans son shell est dite interne (de portée locale). Elle n’est connue qu’à l’intérieur du shell courant. Pour qu'elle puisse être transmise aux processus fils un attribut spécifique doit être positionné sur la variable, c'est que que permettent de faire les primitives export ou declare.

# par convention les variables d'environnement ont un label en lettres majuscules
MAVAR2="hello from Bash pid=$$ !"
export MAVAR2
 
# Equivalent de export
declare -x MAVAR2

Avec la primitive declare on modifie à volonté l' attribut (exportable ou pas) d'une variable (-x/+x).

# Création d'une variable d'environnement nommée TEST
declare -x TEST=test_value
 
# Affiche la valeur de la variable environnement TEST
printenv TEST
test_value
 
# Affiche les attributs de la variable TEST
declare -p TEST 
declare -x TEST="test_value"
 
 
# Modifie l'attribut de TEST, la variable devient interne (non exportable)
declare +x TEST
 
# Affichage de la variable d'envirronement TEST retourne une chaine vide
printenv TEST
 
# Affiche les attributs de la variable TEST
declare -p TEST 
declare -- TEST="test_value"
 
# Affiche la valeur de la variable interne TEST
echo $TEST
test_value

Ponctuellement, la commande env permet de modifier l'environnement disponible pour la commande passée en paramètre:

env MANPAGER=cat man printf

Dans cet exemple le processus fils dans lequel s’exécute la commande man a une variable environnement MANPARGER dont la valeur est cat. La page de manuel est affichée via le programme cat.

Sur certains systèmes il est possible d'omettre la commande env et d'obtenir le même résultat.
# Executer une commande après modification de son environnement
env VAR1=V1 VAR2=V2 commande
 
# équivalent sur certains systèmes
VAR1=V1 VAR2=V2 commande

Les options du shell Bash

Le comportement du shell Bash est définit par les options positionnées sur la ligne de commande lors de l'invocation de celui-ci. Elles peuvent être altérer via les primitives shopt ou set.

Pour lister les options et leur valeurs utiliser la commande interne shopt1):

shopt

Pour modifier une option:

# activer une option
shopt -s extglob
 
# désactiver une option
shopt -u extglob

Les primitives set et unset permettent de manipuler les variables, fonctions et options du shell.

Utilisée sans argument, la primitive set affiche l'ensemble des variables et les options du shell ainsi que les fonctions définies.

set

Comme shopt, set permet de manipuler les options du shell:

# afficher les options
set -o
 
# La variable $- liste également les options du shell actives
echo $-
 
# activer l'option d'affichage de la commande interprétée avant exécution
# (option xtrace)
set -o xtrace
 
# équivalent (help set)
set -x
 
# désactiver l'option
set +x
 
# équivalent
set +o xtrace

Fichiers de configuration du shell

Plusieurs fichiers scripts sont chargés en fonction de leur existence et du contexte d'invocation de Bash:

/etc/profile Chargé pour tous les utilisateurs lors de l' invocation d'un shell de login. Commun à plusieurs shells.
/etc/bashrc Chargé après /etc/profile uniquement pour un shell Bash. Contient des déclarations, définitions ou primitives spécifiques à Bash.
~/.profile Propre à l'utilisateur, chargé par un shell de connexion sauf si des fichiers ~/.bash_profile ou ~/.bash_login existent.

Quiz

Quelle commande liste les variables d'environnement?

  • printenv

Indiquez la variable d'environnement associée à la proposition correspondante:

  • Répertoire personnel d'un utilisateur: HOME
  • Description du contenu de l'invite de commande: PS1
  • Nom du répertoire courant: PWD
  • Liste des répertoires contenant les commandes pouvant être utilisées par l'utilisateur: PATH

Comment peut-on modifier de manière permanente la valeur des variables d'environnement?

  • En mettant les valeurs dans le fichier .bashrc ou le fichier .profile et en exportant ces variables.

Parmi les commandes ci-dessous, laquelle permet de configurer l'invite de commande afin qu'elle affiche le nom d'utilisateur suivi d'une espace suivi du nom du répertoire courant suivi d'une espace suivi du caractère '>' et suivi d'une espace?

  • PS1="\u \w > "
1)
shell option
cours/informatique/fun_mooc/maitrise_du_bash_univ-reunion/310_variables_et_environnement.txt · Dernière modification : 2022/01/14 16:31 de yoann