Wikilivres/Aller plus loin avec GRUB/Des variables d'environnement
Les variables d'environnement aperçues au chapitre précédent prennent le forme nom=valeur
.
Comme un développeur peut s'en douter,
- Les variables d'environnement peuvent être consultées ou positionnées par la commande
set
. - Les variables d'environnement peuvent être utilisées dans une séquence de commandes.
Par ailleurs, la consultation de variables qui n'ont pas été positionnées s'explique:
- Les variables d'environnement spéciales peuvent être positionnées en fonction des caractéristiques du système (c'est-à-dire de l'environnement).
- Certaines variables d'environnement peuvent être enregistrées dans un petit bloc d'un millier d'octets, environ.
Commande set
[modifier | modifier le wikicode] # Définition d'une racine, sur un disque hd0 et sur une partition msdos1
set root='hd0,msdos1'
La commande set
est fournie par le fichier kern/corecmd.c
.
Sa documentation anglaise indique un paramètre: [ENVVAR=VALUE]
et une description "Set an environment variable."
.
Elle est implémentée dans une fonction grub_core_cmd_set
.
Suivant le cas:
- En l'absence d'argument, cette fonction peut afficher la liste des variable d'environnement sous la forme
nom=valeur
et renvoie la valeur 0. - En présence d'argument, si l'argument ne contient pas le caractère "=", cette fonction renvoie une erreur.
- En présence d'argument, si l'argument contient le caractère "=", la variable d'environnement présente avant le caractère "=" est positionnée à la valeur présente après le caractère "=", par la fonction
grub_env_set
.
La commande unset
existe également.
Syntaxe d'utilisation des variables
[modifier | modifier le wikicode]L'utilisation des variables avec le caractère $
est fournie par le fichier lex script/yylex.l
.
Est considéré comme utilisation de variable l'expression $
id ou ${
id}
dans laquelle id identifie une variable. Cette variable peut-être un NAME, des DIGITS, OU SPECIAL.
Dans le fichier de code source script/yylex.l
la VARIABLE est définie dans le langage lex comme suit:
VARIABLE ${NAME}|$\{{NAME}\}|${DIGITS}|$\{{DIGITS}\}|${SPECIAL}|$\{{SPECIAL}\}
Précisions les trois cas:
- NAME est défini comme au moins un caractère alphabétique ou underscore, suivi d'un ou plusieurs caractère alphanumériques ou underscore;
- DIGITS est défini comme une séquence d'au moins un chiffre;
- SPECIAL est défini comme l'un des caractères
?
,#
,*
,@
.
Son utilisation est prévu dans ce qui est considéré comme un mot.
Le mot y est définit comme une séquence d'au moins un élément parmi: un des 241 caractères non spéciaux (CHAR); une chaîne délimitée par des doubles quotes "
(DQSTR); une chaîne délimitée par des simples quotes '
(SQSTR); un caractère échappé par le caractère \
(ESC); la variable dont nous venons de parler introduite par le caractère $
, une chaîne I18NSTR.
Dans le fichier de code source script/yylex.l
la VARIABLE n'est utilisée dans le langage lex que dans le seul cas du mot:
WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE}|{I18NSTR})+
Toutefois, ce mot peut se trouver au niveau du script ou bien à l'intérieur d'une chaîne à double quote. La signification de cette variable peut être différente selon le cas.
Utilisation des variables
[modifier | modifier le wikicode]Les variables peuvent être utilisées pour conditionner une séquence de commandes.
# Chargement conditionnel de modules de décompression
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
Dans cet exemple, nous pouvons reconnaître le mot (WORD) composé de la concaténation du caractère x
et de la variable $grub_platform
.
Dans cet exemple une comparaison est effectué entre x$grub_platform et xxen. La valeur est vraie lorsque $grub_platform et xen sont identiques.
La commande test
également désignée [
permet d'opérer ce genre de comparaisons, à la manière de ce qui existe dans le bash
.
La liste exacte et exhaustive des tests existant est documentée dans le manuel de documentation en langue anglaise.
Ces opérations sont pour l'essentiel des opérations de comparaison de chaînes, de comparaison d'entiers, de fichiers et des opérations booléennes.
Variables d'environnement spéciales
[modifier | modifier le wikicode]Le manuel de documentation en langue anglaise indique que certaines variables d'environnement sont spéciales. En voici une liste:
- biosnum:
- check_signatures:
- chosen:
- cmdpath:
- color_highlight:
- color_normal:
- config_directory:
- config_file:
- debug:
- default:
- fallback:
- gfxmode:
- gfxpayload:
- gfxterm_font:
- grub_cpu:
- grub_platform:
- icondir:
- lang:
- locale_dir:
- lockdown:
- menu_color_highlight:
- menu_color_normal:
- net_<interface>_boot_file:
- net_<interface>_clientid:
- net_<interface>_clientuuid:
- net_<interface>_dhcp_server_name:
- net_<interface>_domain:
- net_<interface>_extensionspath:
- net_<interface>_hostname:
- net_<interface>_ip:
- net_<interface>_mac:
- net_<interface>_next_server:
- net_<interface>_rootpath:
- net_default_interface:
- net_default_ip:
- net_default_mac:
- net_default_server:
- pager:
- prefix:
- pxe_blksize:
- pxe_default_gateway:
- pxe_default_server:
- root:
- shim_lock:
- superusers:
- theme:
- timeout:
- timeout_style:
- tpm_fail_fatal:
Par exemple les variables lang
et local_dir
sont utilisées pour avoir certaines informations en langue française.
La variable pager
positionnée à 1
est utilisée pour retenir les informations le temps de la lecture, jusqu'à l'appui d'une touche.
La variable prefix
contient le nom du dossier où son trouvés les modules à charger.
La variable root
contient le nom du périphérique racine, par exemple ‘hd0,msdos1’ lorsque le prefix
est
‘(hd0,msdos1)/boot/grub’.
Bloc d'enregistrement
[modifier | modifier le wikicode]Le manuel de documentation en langue anglaise précise que certaines variables d'environnement peuvent être chargées avec la commande load_env
et enregistrées avec la commande save_env
.
Résultats de commandes
[modifier | modifier le wikicode]Des variables peuvent être positionnées avec des résultats de commandes. Citons deux exemples:
- La commande
search
peut positionner une variable avec sont résultat. - La commande
regexp
peut positionner une variable à partir d'une sous-chaîne d'une chaîne initiale, au moyen d'une expression rationnelle. - La commande
read
peut positionner une variable à partir d'une ligne saisie par l'utilisateur. - La commande
probe
peut positionner une variable