3.2. Substitutions de commandes et paramètres régionaux

Créé par des informaticiens américains, le système Unix était originellement destiné à des utilisateurs anglophones. La diffusion des systèmes de la famille Unix (dont GNU/Linux) vers des publics de langues et de cultures différentes a conduit leurs développeurs à introduire des paramètres régionaux (locale). Ces derniers permettent par exemple de fixer la langue d'affichage des messages, le format des dates ou des nombres. Les paramètres régionaux se présentent à l'utilisateur sous la forme de variables prédéfinies dont le nom commence par LC_.

La commande unix locale utilisée sans argument affiche la valeur courante de ces informations régionales.

$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
$

Des commandes telles que date utilisent ces valeurs pour afficher leurs résultats.

$ date
jeu. 06 janv. 2022 08:52:38 CET
$

On remarque que le format du résultat correspond bien à une date « à la française » (jour de la semaine, jour du mois, mois, année). Si cette internationalisation procure un confort indéniable lors d'une utilisation interactive du système, elle pose problème lorsque l'on doit écrire un programme shell se basant sur la sortie d'une telle commande, sortie qui dépend étroitement de la valeur des paramètres régionaux. La portabilité du programme shell en est fortement fragilisée.

Toutefois, le fonctionnement standard d’un système unix traditionnel peut être obtenu en choisissant la « locale standard » appelée C. Pour que cette locale n’affecte temporairement que les résultats d’une seule commande, par exemple date, il suffit d’exécuter la commande LC_ALL=C date.

$ LC_ALL=C date
Thu Jan  6 08:54:13 CET 2022
$

On s’aperçoit qu’avec la locale standard, le jour du mois est en troisième position alors qu’avec la locale précédente, il était en deuxième position. Pour obtenir de manière portable le jour courant du mois, on pourra exécuter les commandes suivantes :

$ set $(LC_ALL=C date) ; echo $3
6
$