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

Re: Eigenatiges BASH problem...



Michelle Konzack <linux4michelle@freenet.de> writes:

> Am 2005-03-23 21:07:53, schrieb Bruno Hertz:
>
>> Um auch für die Shell also  LC_COLLATE auf C zu setzen
>>  LC_COLLATE=C
>>  ls $HOME/devel/bash/[A-Z]*.tmp
>
> Hä ? Für was ?

Stimmt, war falsch. Richtig:
 export LC_COLLATE=C
 ls $HOME/devel/bash/[A-Z]*.tmp

> Ein 'ls $HOME/devel/bash/[A-Z]*.tmp' benötigt kein LC_COLLATE.

Inkorrekt. Es braucht es sogar zweimal:

(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'

(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)

> Das LC_COLLATE ist nur bei 'ls $HOME/devel/bash/*.tmp' witksam.

Leider falsch. man bash.

>> Um es auch für Subshells/geforkte Prozesse wirksam zu machen
>>  export LC_COLLATE=C
>
> Das will ich aber nicht...
>
> LC_COLLATE=de_DE

Das wird nicht gehen. Entgegen eines vorherigen Postings von mir (hatte
einen Fehler gemacht weil bei mir de_DE überhaupt nicht installiert war,
deshalb hatte ein entsprechendes collate setting auch keine Auswirkung)
ist die collation order für de_DE die gleiche wie bei en_US, nämlich
 a A b B .... z Z

D.h. eine range expression der Form [A-C] enthält die Buchstaben
 A b B c C
d.h. eben nicht nur Grossbuchstaben, und gemäß dieser Reihenfolge wird auch
sortiert.

Du kannst aber [ABCDEFGHIJKLMNOPQRSTUVWXYZ] schreiben, das geht dann
auch mit de_DE :)

Die collation order ist für die country locales vor einiger Zeit mal umgestellt
worden (sie war vorher wie ASCII, i.e. entsprechend LC_COLLATE=C). Das ist aber
schon Jahre her, meine ich ...

>> Wie du auf RegExp kommst ist mir ein Rätsel. Hat das irgendjemand erwähnt?
>> Und brüllen mußt du auch nicht unbedingt ...
>
> Esa geht darum das die BASH [A-Z]* expandiert,
> aber ein SCRIPT in der gleichen Shell es ignoriert.

Du meinst daß das Skript anders expandiert als die Shell. Mit regexps hat
das aber nichts zu tun, und das hat auch niemand behauptet.

> Ihr redet nur con LC_COLLATE was nichts damit zu tun hat.
> Ich habe erste heute vormittag eine WOODY Maschine von den 3.0r0
> CD's installiert und mein Script funktioniert...

Unser Thema war die Sortierreihenfolge von Ausdrücken wie
 ls /irgendeinpfad/[A-Z]*.irgendwas
und welche Buchstaben (klein,groß) in solchen range expressions
vorkommen. Und das ist sowohl was die shell expansion als auch die
Sortierung von ls angeht bestimmt von LC_COLLATE.

Probier's dochmal mit einem Testskript der Form

 LC_COLLATE=$1
 echo $LC_COLLATE
 # shell expansion gemäß $1
 echo /irgendeinpfad/[A-Z]*.irgendwas
 # shell expansion und sortierung von ls; da LC_COLLATE nicht
 # exportiert wurde, greift $1 hier noch nicht
 ls /irgendeinpfad/[A-Z]*.irgendwas
 export LC_COLLATE
 # shell expansion gemäß $1
 echo /irgendeinpfad/[A-Z]*.irgendwas
 # ausgabe von ls sollte mit vorherigem echo korrespondieren
 # da LC_COLLATE exportiert wurde
 ls   /irgendeinpfad/[A-Z]*.irgendwas

und ruf es mit skript.sh C resp. de_DE und wasnoch auf. Dann wird
die Sache vielleicht klarer.

> Nach dem Update auf r4 funktionierren keine BACKUP-Scripts und
> jede menge andere Scrips nicht mehr.

Schlimm.

> Soweit ich das aus GOOLGE erfahren habe hängt das mit dem Security
> update der libc6 zusammen... da ist was kaputt gegangen.

Kann sein. Wie gesagt habe ich kein Woody, nur Sarge. Letztres ist
aber up-to-date, und die Dinge funktionieren hier genau so wie von
mir beschrieben.

> LC_COLLATE="de_DE@euro"

OK, das sollte dann aber auch für die interaktive Shell gelten. Wenn
die mit diesem setting [A-Z] in A B C ... Z expandiert, ist etwas komisch.
Sie sollte es in a A b B ... z Z expandieren, interaktiv ebenso wie
per Skript.



Reply to: