Michelle Konzack <[EMAIL PROTECTED]> writes:

> Am 2005-03-23 22:38:19, schrieb Bruno Hertz:
>
>> (1) $HOME/devel/bash/[A-Z]*.tmp wird von der Shell expandiert.
>>     Die Reihenfolge wird dabei bestimmt von LC_COLLATE. man bash,
>>     'path expansion' und 'range expression'
>
> Was bedeutet das GNU/Linux plötzlich Case-Insensitive geworden ist.
> denn bei mir sind A-Z GROSSbuchstaben und a-z kleinBUCHSTABEN.

S.u.

>
>> (2) ls erhält die expandierte Parameterliste und sortiert jetzt
>>     aber nochmal, wieder gemäß LC_COLLATE. Deshalb oben das export.
>>     man strcoll (wird von ls verwendet)
>
> Aber die expandierte Liste ist enen nur [A-Z]* .
> Also woher kommt dann [a-z]* ?

Unter de_DE ist [A-Z] = A b B c C ... z Z

> Dann darf es am BASH Prompt ja auch nicht funktionieren,
> was es aber tut.

Skript und interaktive Shell sollten mit demselben LC_COLLATE gleich
arbeiten, richtig. Wenn es das bei dir nicht tut, hast du (noch) ein
anderes Problem. Bei mir funktioniert es einheitlich.

>> > LC_COLLATE=de_DE
>> 
>> Das wird nicht gehen. Entgegen eines vorherigen Postings von mir (hatte
>
> Das wiederspricht dann aber das am BASH prompt es auch funktiniert.
>
> wenn ich z.b. 
>
>     for i in `ls -d` ; do ls $i/[A-Z]* ; echo ; done
>               ^^^^^       ^^^^^^^^^^^^
>             Sub-SHELL      Sub-SHELL
>
> aufrufe funktioniert es einwqndfrei, wogegen Deine Erklärung nicht
> standhällt.

Kann ich nichts zu sagen ohne Verzeichnisinhalte und output.

> Ich habe innerhalb des Scripts locale aufgerufen und es liefert die
> gleiche Antwort wie am BASH prompt.
>
> Wenn am BASH Prompt 'ls [A-Z]*' funktioniert und im BASH Script die
> gleichen locale vorhanden sind, muß der Fehler noch woanderst liegen.

Kann sein.

> Ich gebe ja an das ich nur Dateien die mit GROSS Buchstaben anfangen
> haben will.  LC_COLLATE hat aber mit der Sortierreihenfolge zu tun.
>
> (hat mir jemand von der debian-devel klar gemacht)

Hier versucht dir auch einer was klar zu machen, und es gestaltet sich
sehr mühsam. Deine Aussage, du gäbest an 'nur GROSS Buchstaben' haben zu
wollen, ist verkehrt. Unter de_DE heißt [A-Z] eben nicht 'nur GROSS
Buchstaben', sondern alle Buchstaben die gemäß der wirksamen Sortierreihenfolge
in dem Range A bis Z enthalten sind. Wenn die Sortierung aber eben
a A b B ... z Z ist, sind in dem Range auch alle Kleinbuchstaben außer
(klein) a enthalten.

>   __( command 'skript.sh de_DE' )_______________________________________
>  /
> | de_DE
> | /home/michelle.konzack/devel/bash/[A-Z]*.tmp

Wieso wird das nicht expandiert? Hast du quotes eingefügt?

> | /home/michelle.konzack/devel/bash/BASE.tmp
> | /home/michelle.konzack/devel/bash/help_version.tmp
> | /home/michelle.konzack/devel/bash/pid.tmp
> | /home/michelle.konzack/devel/bash/prog_parts_by_option.tmp
> | /home/michelle.konzack/devel/bash/read_config.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_help_and_pid.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_help.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_pid.tmp
> | /home/michelle.konzack/devel/bash/td.tmp

Wie erwartet unter de_DE (für ls greift hier deine default
locale).

> | /home/michelle.konzack/devel/bash/[A-Z]*.tmp

Wieso wird das nicht expandiert? So können wir es nicht mit der
Ausgabe von ls vergleichen.

> | /home/michelle.konzack/devel/bash/BASE.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_help_and_pid.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_help.tmp
> | /home/michelle.konzack/devel/bash/SKEL_with_pid.tmp
> | /home/michelle.konzack/devel/bash/help_version.tmp
> | /home/michelle.konzack/devel/bash/pid.tmp
> | /home/michelle.konzack/devel/bash/prog_parts_by_option.tmp
> | /home/michelle.konzack/devel/bash/read_config.tmp
> | /home/michelle.konzack/devel/bash/td.tmp

Das sollte nicht sein, da du das Skript mit de_DE aufgerufen hast,
was sowieso deiner default locale entspricht. Ein export macht also
gar keinen Unterschied. Der Range wird zwar noch richtig von der Shell
expandiert (inklusive Kleinbuchstaben), aber ls sortiert gemäß C
locale. Ist dein ls veraltet (strcmp statt strcoll für Vergleiche) ?
Aber dann sollte es oben ja das gleiche sein, da du ja mit de_DE
eigentlich sowieso nichts änderst. Sehr undurchsichtig. Hast du ein
LC_COLLATE=C vor das zweite ls gesetzt? Im übrigen wäre der Vergleich
mit C ja sowieso das interessante gewesen ...

>  \______________________________________________________________________
>
> Das ist aber nicht das was ich will, denn ich habe ja [A-Z]* angegeben
> und nicht [A-Za-z]*.  Im Script wird einfach GROS und klein Schreibung
> ignoriert.  LC_COLLATE sortiert zwar richtig, aber 'ls' zeigt falsch an.

Ich rede über die Expansion von ranges jetzt nicht nochmal. Wenn du jetzt
noch nicht verstanden hast daß [A-Z] nicht automatisch 'nur Großbuchstaben'
heißt kann ich auch nichts mehr dazu sagen.

> Also ich habe hier eine Develststion mit POTATO, WOODY, SARGE und SID
> chroots... 
>
> Ich habe überall den gleichen Fehler... (i386 + amd64)
>
> Auf 68k und powerpc habe ich das ergebnis wie bei Dir.

Wenn der 'Fehler' mal einer ist.

Aber egal, ich habe alles gesagt was ich zu sagen habe. Deine Skripte kannst
du mit LC_COLLATE=C laufen lassen wenn du sie nicht auf character classes
umschreiben willst, und wenn du das nicht magst ist das eben deine Sache.

Antwort per Email an