Bruno Hertz wrote on 24/03/2005 02:39:
Sven Mueller <[EMAIL PROTECTED]> writes:

Bruno Hertz wrote on 24/03/2005 00:01:

[stripped]

Also irgendwie ist das Verhalten der Bash bei mir schon sehr merkw�rdig.

Voraussetzung: Verzeichnis mit leeren Dateien der Namen
a b c d e f g A B C D E F G

weiterhin: Skript (../t.sh vom fraglichen Verzeichnis aus) mit
folgendem Inhalt:

======================================================
#!/bin/bash
unset LC_CTYPE LC_ALL LC_COLLATE
export LC_CTYPE=$1
printenv | grep LC
for i in `echo [A-C]`; do
        echo $i
done
======================================================

Dann noch in der aktuellen interaktiven Shell LC_COLLATE=de_DE
gesetzt. So, jetzt rufe ich das Skript auf:

# ../t.sh C
LC_COLLATE=C
A
b
B
c
C

H�? Laut Deiner Aussage m�sste das eigentlich nur A B und C (nach
LC_COLLATE=C) ausgeben. Wenn ich statt C de_DE oder us_US angebe, dann
bleibt die Ausgabe wie oben gezeigt.

Setze ich jetzt in meiner interaktiven Shell LC_COLLATE auf C (oder
l�sche es samt der anderen LC_* Variablen), dann bleibt die Ausgabe
des Scripts wieder v�llig unbeeindruckt vom �bergabeparameter,
abgesehen von der Ausgabe der LC_COLLATE-Zeile. Nur sieht es diesmal
so aus:

# ../t.sh de_DE
LC_COLLATE=de_DE
A
B
C

H�? Laut Deiner Aussage m�sste das Script eigentlich A b B c C
ausgeben, oder?

Vergiss mal das unset LC_ALL.

Das �ndert nichts. LC_COLLATE hat Vorrang vor LC_ALL&LC_CTYPE.

Um es richtig sch�n zu machen, hier noch zwei Beispiele:

# LC_COLLATE=C ../t.sh de_DE
LC_COLLATE=de_DE
A
B
C

# LC_COLLATE=de_DE ../t.sh C
LC_COLLATE=C
A
b
B
c
C


S.o.


Jetzt schlauer? Hint: Selbst die angeblichen Subshells sind nicht
wirklich eigene Instanzen der Bash sondern werden intern aufgel�st.

Schlauer, ja, in Bezug auf dich :) Erz�hl doch nochmal genau was 'intern aufgel�st' hei�t. Ich versteh das irgendwie nicht ... :)

Ganz einfach: Die Bash startet f�r Prozesse in `` keinen eigenen Prozess, wenn sondern erstellt nur einen neuen internen Context. Programme in `` werden nat�rlich ebenso gestartet, wie auch bei direktem Aufruf. Auch f�r Pseudo-Subshells wie "( ls; echo N )" wird kein eigener Shell-Prozess gestartet, sondern nur ein Thread bzw. neuer interner Context.


Deshalb macht es auch absolut keinen Unterschied f�r die Aufl�sung von Aufz�hlungen auf der Kommandozeile, ob Du vor einem "for i in [A-C]; do echo $i; done" nun LC_COLLATE �ndert oder nicht.

Leg mal ein Verzeichnis an mit den Dateien a A b B (das reicht f�r die Demonstration) und mache nacheinander folgendes:
====================================================
unset LC_ALL LC_CTYPE LC_COLLATE
bash # wird ohne locales-Spezifikationen im Environment gestartet
for i in [A-B]; do echo $i ; done
LC_COLLATE=de_DE
for i in [A-B]; do echo $i ; done
LC_COLLATE=C
for i in [A-B]; do echo $i ; done
exit
export LC_COLLATE=de_DE
bash # hat jetzt LC_COLLATE=de_DE gesetzt
for i in [A-B]; do echo $i ; done
LC_COLLATE=de_DE
for i in [A-B]; do echo $i ; done
LC_COLLATE=C
for i in [A-B]; do echo $i ; done
exit
export LC_COLLATE=C
bash # hat jetzt LC_COLLATE=C gesetzt
for i in [A-B]; do echo $i ; done
LC_COLLATE=de_DE
for i in [A-B]; do echo $i ; done
LC_COLLATE=C
for i in [A-B]; do echo $i ; done
exit
====================================================


Und versuche zu verstehen, warum die Ausgaben so aussehen, wie sie aussehen.

die Shell die Pattern Expansion macht, ist also fraglich, was bei
ihrem Aufruf der Wert von LC_COLLATE war.

Und so habe ich das obige Script dazu gebracht, das zu tun, was ich wollte:

Nochmal:
Daf�r, wie die Shell ein Pattern aufl�st ist nicht der Wert von LC_COLLATE zum Zeitpunkt der Pattern-Expansion zust�ndig, sondern der Wert von LC_COLLATE (oder LC_ALL, wenn LC_COLLATE nicht gesetzt ist) zu dem Zeitpunkt, als die Shell aufgerufen wurde.
Die Bash initialisiert die locales-Klamotten nicht neu, wenn die Environment-Variablen ge�ndert werden. Daher ist es ihr v�llig schnuppe, wenn man die w�hrend der Laufzeit der Bash �ndert. Andererseits sind die ge�nderten Werte f�r aufgerufene Programme (und dazu geh�ren Shellscripte) nat�rlich schon wichtig.


Alles klar?

Sicher.

Scheinbar nicht.

Meine Empfehlungen (in dieser Reihenfolge):

 man -S 7 locale
 http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html

und schlie�lich die glibc Mailingliste.

Kenne ich, danke. Ich weiss, wie locales funktioniert. Du aber scheinbar nicht vollst�ndig.


Ciao,
Sven


--
Haeufig gestellte Fragen und Antworten (FAQ): http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)



Antwort per Email an