linux-l: Globale Variable ändern???

Guntram Trebs gunni at mathematik.hu-berlin.de
Sa Feb 17 18:27:16 CET 2001


On Sat, 17 Feb 2001, Erwin Kaiser wrote:

> Hallo,
> ich versichere hiermit an Eides Statt, daß ich mehr als fünf
> Stunden Doku und manpages gelesen habe und wirklich nicht
> verstehe, was ich falsch mache. 

sehr gut

Bestimmt/hoffentlich hast Du dabei auch einige Anregungen gesammelt, 
die nicht mit dem PRoblem zusammenhängen, oder?

> Mein PC stellt nach jedem Start die Uhr eine Stunde zurück, ich
> habe deswegen in mein ip-up.local-Skript, das bei jedem Dialin
> ausgeführt wird, ein netdate aufgenommen. 

Uhrzeit setze ich grundsätzlich im Bios!
( Da weiß man, was man hat)

Vielleicht setzt du die Systemzeit mit date
und nicht die Bios-Zeit ( hwclock)
Dann geht die Systemzeit beim beenden des Systems ver-
loren und wird beim nächsten Boot mit der Bios-Zeit
neu initialisiert. 

> Weil ich mir nur dachte: Wenn die Uhr schon mal gestellt ist,
> brauche ich sie beim nächsten Dialin ja nicht nochmal zu stellen,
> habe ich eine globale Variable ZEITGESTELLT=0 definiert und
> versuche, sie nach erfolgreichem netdate auf 1 zu setzen, damit
> er das nächste netdate überspringt. 
> 
> Vorweg: Es gibt sicher drei- oder viermal elegantere
> Möglichkeiten, ich verstehe aber lediglich nicht, warum durch das

Ja, ich mußte einem 80486 das neue Jahrtausend schmackhaft machen.
Der wollte aber keine Bios-Updates und auch kein Jahr 2000 in der
RTC.

Also habe ich die RTC um 6 Jahre zurückgestellt und ein Bootscript
in /etc/rc.d installiert, daß die Systemzeit um 6 Jahre vorstellt.

Funktioniert wunderbar.

> folgende Skript die globale Variable nicht verändert wird. (Ich
> führe es als user erwin aus; ZEITGESTELLT wird in der bashrc
> beim einloggen als user erwin gesetzt.)
> 
> if [ $ZEITGESTELLT = 0 ]; then 
> {
> export ZEITGESTELLT=1
> su1 netdate -vu time.fu-berlin.de
> }
> fi
> 

Da gibt es ein Problem. (wie Du richtig erkannt hast.

Die Variable $ZEITGESTELLT wird zwar exportiert.
Das heißt, wenn Du Dein Script startest, erhält
es diese Variable mit seinem Environment. Aber
wenn es beendet wird, wird dadurch nicht die Variable
in der bash aktualisiert.

Wenn Du das Script startest, wird ein neuer Prozess
geöffnet, der auch ein anderes Environment hat, als Deine
bash-shell. Dieses Environment muß irgendwie initialisiert
werden. Und das geschieht, indem alle export-Variablen
in das neue Environment kopiert werden. ( Wichtig: KOPIERT! )
Genaueres steht in den Manuals zu bash, export, declare, unset

Wenn das Script beendet wird, wird sein Environment einfach 
weggeschmissen. 

Es würde auch ein ziemliches Durcheinander geben, wenn das nicht 
so wäre. Zum Beispiel ist PWD eine Variable, die exportiert wird.
probier mal: export PWD=/
Es würde also jedesmal Dein aktueller Pfad durcheinandergewürfelt werden,
wenn gerade ein Kindprozess sich beendete und Dein Environment
überschriebe.

Also:

export TEST=1;(export TEST=2); echo $TEST
ergibt: 1

export TEST=1; { export TEST=2; }; echo $TEST
ergibt: 2

Der Unterschied:
Bei ( ) wird ein neuer Prozeß geöffnet, wie bei Deinem Script
Bei {} werden nur Befehle gruppiert.

Was Du machen willst, solltest Du lieber ganz anders lösen.
( Uhrzeit konfigurieren, siehe Zeitzonen-Thread, der gerade 
  läuft und läuft und läuft ... )

Wenn Du so eine Variable brauchst, mußt Du shell-Funktionen
benutzen, da sie ablaufen, ohne daß neue Prozesse gestartet
werden:


function gruener_punkt { 
  if test _$x = _1; 
  then  
    x=2; 
    echo einmal; 
  else 
    echo und ab in die Tonne; 
  fi; 
}

x=1
gruener_punkt
gruener_punkt
gruener_punkt

ergibt:

einmal
und ab in die Tonne
und ab in die Tonne



Guntram




Mehr Informationen über die Mailingliste linux-l