Umgebung setzen mit BASH-Script ?

Post Reply
Message
Author
Henry G.

Umgebung setzen mit BASH-Script ?

#1 Post by Henry G. »

Wie kann mit einem Shell-Script Aufruf in meiner Konsole Umgebungsvariablen definieren ?

In der csh/tcsh kann ich mit source scriptname Umgebungsvariablen sourcen -- nur wie mache ich das selbe mit der BASH ?

----8<----
# javarc
set JAVA_HOME = ( /usr/lib/java )
set CLASSPATH = ( .:./java/lib/jdom.jar )
----8<----
Nach "source javarc" sind die beiden Umgebungsvariablen gesetzt und können verwendet werden.


Innerhalb eines BASH Scripts funktionierts ja wenn, nur wenn ich eine Bash-Version von javarc aufrufe sind nur für Befehle innerhalb des Scriptes die Variablen gesetzt. Wenn ich das Scripte von einem anderen Bash-Script auf mit ". javarc" aufrufe und die Variablen exportiere dann funktionierts auch nur so lange das Script läuft. Nach Beendigung des Scripts sind die Variablen wieder nicht definiert bzw. auf ihrem ursprünglichen Wert.

Was mache ich falsch ?

Unter DOS/Windows kann ich ja auch BATCH Dateien erstellen die an der DOS-Konsole aufgerufen mir die Umgebungsvariable setzen.

Thomas Mitzkat

Re: Umgebung setzen mit BASH-Script ?

#2 Post by Thomas Mitzkat »

export VARIABLE=wert

Henry G.

Re: Umgebung setzen mit BASH-Script ?

#3 Post by Henry G. »

Ja so habe ich es mir auch gedacht, nur funktioniert das nicht.

----8<----
#!/bin/sh
# script: javarc.sh
export CLASSPATH=.:./java/lib/jdom.jar
echo "CLASSPATH ist $CLASSPATH"
----8<----

$ ./javarc.sh
CLASSPATH ist .:./java/lib/jdom.jar
$ echo $CLASSPATH

$

Das Script setzt die Variable, aber nach Beendigung des Scripts ist die Variable weg. Die mit export deklarierten Variablen scheinen nur für die Laufzeit des Scripts zu "leben" und dann auch nur für sich und für alle Kind-Shells, die geöffnet werden.

Was ich aber machen möchte ist, dass bei Scriptaufruf (= starten einer Kind-Shell) die Variable in der Vater-Shell (aus Sicht der Kind-Shell) also in meiner aktuellen Login-Shell gesetzt wird. So was wie die Variablen in der .profile nur eben als Shell-Script, das ich bei Bedarf aufrufen kann um mir die Umgebungsvariablen zu setzen.

Mit der csh/tcsh scheint es ja auch zu gehen:

----8<----
# script javarc.csh
set CLASSPATH = ( .:/home/gt003963/src/java/lib/jdom.jar )
----8<----

$ echo $CLASSPATH
CLASSPATH: Undefinierte Variable.
$ source javarc.csh
$ echo $CLASSPATH
.:/home/gt003963/src/java/lib/jdom.jar
$

Na also. Bei der csh geht's ja nur halt möchte ich hierzu nicht immer in eine csh wechseln nur um das ausführen zu können.

Thomas Mitzkat

Re: Umgebung setzen mit BASH-Script ?

#4 Post by Thomas Mitzkat »

Du willst die Variable in der "bash" haben und rufst "sh" auf???? Im Übrigen kannst Du systemweite Variblen in /etc/profile setzen.

----8<----
<u><b>#!/bin/bash</b></u>
# script: javarc.sh
export CLASSPATH=".:./java/lib/jdom.jar"
echo "CLASSPATH ist $CLASSPATH"
----8<----

Henry G.

Re: Umgebung setzen mit BASH-Script ?

#5 Post by Henry G. »

/bin/sh ist nur ein SymLink auf /bin/bash

aber auch mit Angabe von #!/bin/bash läuft das Script nicht so wie gewollt.
<pre>
so siehts zur Zeit aus:

-LOGIN
+---BASH
! javarc.sh aufrufen
+---javarc.sh
! ! startet BASH
! ! setzt CLASSPATH Variable
! ! echo $CLASSPATH (innerhalb des Scriptes) zeigt Wert der Variable
! ! BASH-Prozess beendet sich
!
! CLASSPATH Variable ist hier undefiniert
!

und so sollte es eigentlich werden:

-LOGIN
+---BASH <----------------------------------------------------------
! javarc.sh aufrufen !
+---javarc.sh !
! ! startet BASH !
! ! setzt CLASSPATH Variable !
! ! CLASSPATH Variable wird in die Vatershell durchgereicht ---
! ! echo $CLASSPATH (innerhalb des Scriptes) zeigt Wert der Variable
! ! BASH-Prozess beendet sich
!
! CLASSPATH Variable ist hier definiert
! da da Script die Variable ja in der Vatershell gesetzt hat.
!
</pre>

schlops
Posts: 102
Joined: 17. Feb 2000 12:12

Re: Umgebung setzen mit BASH-Script ?

#6 Post by schlops »

Sers!

Den Tip mit EXPORT hast Du ja schon gekriegt, und den naechsten Tip hast Du schon selbst geschrieben <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">:
<b>source javarc.sh</b>
Damit sollte es gehen.

Stay Rude

Henry G.

Re: Umgebung setzen mit BASH-Script ?

#7 Post by Henry G. »

Danke

ich hab' die ganze Zeit versucht die Variable zu behalten, wenn ich das Script *ausführe*;
Dass ich das wie bei einer csh auch, per "source <scriptname>" aufrufen kann wusste ich nicht.

In den Beispielscripten die ich mir angeschaut habe, wird ein anderes Scripte nie mit "source <scriptname>" eingebunden sondern immer nur mit ". <scriptname>".

schlops
Posts: 102
Joined: 17. Feb 2000 12:12

Re: Umgebung setzen mit BASH-Script ?

#8 Post by schlops »

Hehe, da Informatiker schreibfaule Menschen sind , geht der "<b>.</b>" natürlich auch, ist nur ne Abk. für <b>source</b>.

Stay Rude!

Thomas Mitzkat

Re: Umgebung setzen mit BASH-Script ?

#9 Post by Thomas Mitzkat »

Super, ich hab beim Übertragen der SuSE-7.1-LiveEval auf die Festplatte den MC auf "follow Symlinks" stehen gehabt, daher war "sh" kein link. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Die Variablen werden nur den Childprozessen vereerbt?!

User avatar
heinrich
Posts: 219
Joined: 22. Sep 1999 11:22
Location: N49.137 E8.544

Re: Umgebung setzen mit BASH-Script ?

#10 Post by heinrich »

> Die Variablen werden nur den Childprozessen vereerbt?!

Scheinbar ja.
Nach beenden des Childprozessen sind auch alle Variablen die der Childprozess erzeugt hat wieder undefiniert. (Siehe auch die ein Zeichnung von Henry ein paar Postings oben drüber).

Jochen

Re: Umgebung setzen mit BASH-Script ?

#11 Post by Jochen »

Nicht nur scheinbar <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.

Es ist ganz einfach: Die Environment-Variablen (alle in der sh/back/ksh mittels "export" exportierten oder in der csh/tcsh mit "setenv" gesetzten) sind Bestandteil des Prozesses. Lasse ich ein neues Kommando ausführen, wird dafür ein neuer Prozess gestartet, der ererbt das Environment vom Elternprozess (häufig eine Shell). Werden nun im Kindprozess irgendwelche Environment-Variablen gesetzt, rührt das den Elternprozess überhaupt nicht. Wird der Kindprozess dann irgendwann abgebaut, sind damit auch die in diesem Prozess definierten Environment-Variablen weg.

Das "source"-Kommando (bzw. ".", funktioniert auch in der sh) sorgt lediglich dafür, dass das angegebene Skript nicht von einen Kindprozess ausgeführt wird (wie üblich), sondern von der aktiven Shell selbst. Und dann werden die Variablen im Environment der aktiven Shell gesetzt und sind nach Abarbeitung des Skriptes verfügbar. Allerdings sollte in einem Skript zum Sourcen möglichst kein "exit" auftauchen. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Post Reply