SDB:Posix.2 Änderungen

aus openSUSE, der freien Wissensdatenbank


Version: 9.1

Inhaltsverzeichnis

Symptom

Sie haben ein Shellscript oder einen Befehl bei dem Sie Sortierungen machen, Klassifizierungen ([A-Z]) bearbeiten oder in dem Sie Berechnungen an Zahlen mit einem dezimal Trennsymbol (1.5) vornehmen. Dies produziert seit neuestem andere Ergebnisse als vorher.

Beispiel

Sortierung:

user@erde:~> export LC_COLLATE=de_DE
user@erde:~> ls
aaa  AAA  bbb  BBB  ccc  CCC
user@erde:~> export LC_COLLATE=sk_SK
user@erde:~> ls
AAA  aaa  BBB  bbb  CCC  ccc

Ranges:

user@erde:~> export LC_COLLATE=de_DE
user@erde:~> echo [a-c]*
aaa  AAA  bbb  BBB  ccc
user@erde:~> export LC_COLLATE=sk_SK
user@erde:~> echo [a-c]*
aaa BBB bbb CCC ccc

Berechnungen mit dezimal Trennsymbol:

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

Ursache

Viele Programme, unter anderem auch die bash, benutzen für Sortierungen, Klassifizierungen und Berechnungen jetzt sprachabhängige Unterschiede. Zum Beispiel wird in der Deutschen Sprache bei Sortierungen nicht zwischen groß und klein unterschieden, in der Slowakischen Sprache kommt dagegen groß immer vor klein etc.

Lösung

Wenn Sie bestimmte Ausgaben erwarten und nachfolgende Skriptteile dadrauf aufbauen sollten Sie immer sichergehen, dass das Skript in einer definierten Umgebung arbeitet. Das heißt, Sie sollten im Skript die Sprache (locale) bestimmen. Am einfachsten geht dies über die Variable LC_ALL. Mit einem export LC_ALL=C am Anfang des Skripts stellen Sie sicher, dass die Ausgabe immer dem von Ihnen erwarteten entspricht.