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

Re: Wohin mit den eigenen init-Skripten?



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.

Nun der Fall aus dem obigen Artikel, aber mit ls statt rm:

   martinkl@maurice:/tmp/test$ (LANG=C ; ls [a-z])
   a  b  c
   martinkl@maurice:/tmp/test$ (LANG=C ; ls [A-Z])
   A  B  C

Mit der locale C erhält man also das Ergebnis, das vermutlich alle
von uns erwarten würden.

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

Ein, wie ich finde, nicht vorhersehbares und von mir so auch nicht
erwartetes Ergebnis. Ich halte es für inkonsistent und gefährlich.

Eine Lösung besteht darin, in eigenen scripten lower und upper zu
verwenden, wie es in dem, von mir verlinkten Artikel von Ian D.
Allen empfohlen wird:

   martinkl@maurice:/tmp/test$ (LANG=C ; ls [[:lower:]])
   a  b  c
   martinkl@maurice:/tmp/test$ (LANG=C ; ls [[:upper:]])
   A  B  C
   martinkl@maurice:/tmp/test$ (LANG=en_US ; ls [[:lower:]])
   a  b  c
   martinkl@maurice:/tmp/test$ (LANG=en_US ; ls [[:upper:]])
   A  B  C

Damit erhält man auch mit Lokalisierungen die erwarteten Ergebnisse.

Allerdings weiß man nicht, welche scripte da draußen herumschwirren
und in der Distribution verwendet werden, deshalb bevorzuge ich für
root LANG=C.

Ich verwende noch oldstable, kann sein, dass es sich in stable oder
später anders verhält. Shell ist die bash.

Gruß, Martin


Reply to: