SDB:Modifications apportées par Posix.2

Aller à : navigation, rechercher


Version: 9.1

Symptôme

Vous disposez d'un script shell ou d'une commande vous permettant de trier, de manipuler des classes ([A-Z]) ou d'effectuer des calculs avec un symbole de séparation décimal (1.5). Il produit depuis peu d'autres résultats que précédemment.

Exemple

Tri :

utilisateur@terre:~> LC_COLLATE=fr_FR
utilisateur@terre:~> ls
aaa  AAA  bbb  BBB  ccc  CCC
utilisateur@terre:~> LC_COLLATE=sk_SK
utilisateur@terre:~> ls
AAA  aaa  BBB  bbb  CCC  ccc

Intervalles :

utilisateur@terre:~> LC_COLLATE=fr_FR
utilisateur@terre:~> echo [a-c]*
aaa  AAA  bbb  BBB  ccc
utilisateur@terre:~> LC_COLLATE=sk_SK
utilisateur@terre:~> echo [a-c]*
aaa BBB bbb CCC ccc

Calculs avec symbole de séparation décimal :

utilisateur@terre:~> LC_NUMERIC=fr_FR
utilisateur@terre:~> awk 'BEGIN{x=0} {x+=$1} END{print x}' <
> 1.5
> 2
> END
3
utilisateur@terre:~> LC_NUMERIC=en_US
utilisateur@terre:~> awk 'BEGIN{x=0} {x+=$1} END{print x}' <
> 1.5
> 2
> END
3.5

Cause

De nombreux programmes, parmi lesquels bash, prennent désormais en compte les différences liées aux langages pour le tri, les classes et le calcul. Par exemple, la langue française ne fait pas de différence pour l'ordre entre les majuscules et les minuscules, alors que pour la langue slovaque les majuscules viennent toujours avant les minuscules.

Solution

Si vous attendez des résultats précis et si vous devez pour cela écrire de nouveaux scripts, assurez-vous toujours que le script travaille dans un environnement défini. Cela signifie que vous devez configurer la langue (locale) dans vos scripts. La méthode la plus simple est d'utiliser la variable LC_ALL. Un export LC_ALL=C au début du script vous assure que ce que vous obtenez correspond toujours à ce que vous attendiez. <keyword>bash,LANG,locale,posix,tri,intervalles,calc,float,number,format</keyword>