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)

