[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Merkwürdige Locale-Effekte in Bash (war: Re: Wohin mit den eigenen init-Skripten?)



Am Dienstag, 16. Februar 2016, 09:32:31 CET schrieb Martin Klaiber:
> Martin Klaiber <martinkl@zedat.fu-berlin.de> wrote:
> > Marc Haber <mh+debian-user-german@zugschlus.de> wrote:
> >> Warum nicht en_US.utf8? Ich frage das aus ernsthaftem Interesse, weil
> >> ich diesen Bereich nie richtig verstanden habe.
> > 
> > C sortiert meines Wissens nach ASCII-Order, also erst Großbuchstaben
> > ABC, usw. dann erst die Kleinbuchstaben abc, usw. en_US sortiert
> > vermutlich alphabetisch (habe es nicht getestet, sorry, mir fehlt
> > gerade die Zeit), also wie im Wörterbuch: AaBbCc, usw. Das kann bei
> > traditionellen Programmen zu Problemen führen. Sollte es zwar nicht,
> > aber verlassen würde ich mich auch nicht darauf.
> 
> Ich habe noch ein bisschen im web gestöbert und einen Fall gefunden,
> wo das tatsächlich mal schief ging:
> 
>   
> <http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2006-04/msg00734.html
> >
> 
> Für alle, deren Englisch nicht so gut ist: Da hatte jemand versucht,
> mit dem Befehl "rm [A-Z]*" alle Dateien zu löschen, die mit einem
> Großbuchstaben beginnen. Stattdessen wurden aber auch Dateien gelöscht,
> die mit einem Kleinbuchstaben beginnen. Als Ursache stellte sich die
> locale heraus. Hier ein kleiner Test:
> 
>    martinkl@maurice:~$ mkdir /tmp/test
>    martinkl@maurice:~$ cd /tmp/test
>    martinkl@maurice:/tmp/test$ touch a b c A B C
> 
> Ein Test mit ls ergibt:
> 
>    martinkl@maurice:/tmp/test$ (LANG=C ; ls)
>    A  B  C  a  b  c
>    martinkl@maurice:/tmp/test$ (LANG=en_US ; ls)
>    a  A  b  B  c  C
> 
> Die Sortierreihenfolge ist zwar nicht die gleiche, aber die gefundenen
> Dateien sind die gleichen. Das dürfte noch recht harmlos sein.
[…]
> Mit der locale en_US, die angeblich in vielen Distributionen für root
> voreingestellt ist, erhält man aber:
> 
>    martinkl@maurice:/tmp/test$ (LANG=en_US ; ls [a-z])
>    a  A  b  B  c  C
>    martinkl@maurice:/tmp/test$ (LANG=en_US ; ls [A-Z])
>    A  b  B  c  C

Krass! Wie kaputt ist das denn?

Das ist aber nur die bash die da so kaputt ist, die fizsh (friendly Z-Shell 
frontend) liefert das Ergebnis, das ich erwarte:

root@merkaba /tmp# mkdir test
root@merkaba /tmp# cd test
root@merkaba /t/test# touch a b c A B C 
root@merkaba /t/test# (LANG=en_US ; ls [a-z])
a  b  c
root@merkaba /t/test#  (LANG=en_US ; ls [A-Z])
A  B  C
root@merkaba /t/test# bash
root@merkaba:/tmp/test#  (LANG=en_US ; ls [a-z])
a  A  b  B  c  C
root@merkaba:/tmp/test# (LANG=en_US ; ls [A-Z])
A  b  B  c  C
root@merkaba:/tmp/test# exit


Danke für den Hinweis.

Ich denke, das ist einen Bugreport wert!


Das ist für de_DE überigens ganz genauso kaputt:

root@merkaba /t/test# 
root@merkaba /t/test# (LANG=de_DE ; ls [a-z])
a  b  c
root@merkaba /t/test# (LANG=de_DE ; ls [A-Z])
A  B  C
root@merkaba /t/test# bash
root@merkaba:/tmp/test# (LANG=de_DE ; ls [a-z])
a  A  b  B  c  C
root@merkaba:/tmp/test# (LANG=de_DE ; ls [A-Z])
A  b  B  c  C

Ciao,
-- 
Martin


Reply to: