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.
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é.
# 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
exec "$0" "$@"
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 |
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
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.
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.
# 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
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
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. |
Quelle commande liste les variables d'environnement?
Indiquez la variable d'environnement associée à la proposition correspondante:
Comment peut-on modifier de manière permanente la valeur des variables d'environnement?
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?