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