SDB:Modifications apportées par Posix.2
Version: 9.1
Sommaire
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>