# Aller plus loin avec GRUB/Des variables d'environnement

* Utilisation basique
* Clavier QWERTY des États-Unis
* Des commandes derrière les menus
* Dynamique des commandes
* Des commandes de l'exemple
* Des variables d'environnement
* Des systèmes de fichiers
* Utilisation basique
* Clavier QWERTY des États-Unis
* Des commandes derrière les menus
* Dynamique des commandes
* Des commandes de l'exemple
* Des variables d'environnement
* Des systèmes de fichiers
[ Modifier le sommaire ]
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

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

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:
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:
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

Les variables peuvent être utilisées pour conditionner une séquence de commandes.
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

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

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

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