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.
Keywords: bash | LANG | locale | posix | ranges | calc | float | number | format

