Umgebung setzen mit BASH-Script ?
Umgebung setzen mit BASH-Script ?
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.
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.
Re: Umgebung setzen mit BASH-Script ?
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.
----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.
Re: Umgebung setzen mit BASH-Script ?
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<----
----8<----
<u><b>#!/bin/bash</b></u>
# script: javarc.sh
export CLASSPATH=".:./java/lib/jdom.jar"
echo "CLASSPATH ist $CLASSPATH"
----8<----
Re: Umgebung setzen mit BASH-Script ?
/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>
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>
Re: Umgebung setzen mit BASH-Script ?
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
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
Re: Umgebung setzen mit BASH-Script ?
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>".
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>".
Re: Umgebung setzen mit BASH-Script ?
Hehe, da Informatiker schreibfaule Menschen sind , geht der "<b>.</b>" natürlich auch, ist nur ne Abk. für <b>source</b>.
Stay Rude!
Stay Rude!
Re: Umgebung setzen mit BASH-Script ?
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?!
Die Variablen werden nur den Childprozessen vereerbt?!
Re: Umgebung setzen mit BASH-Script ?
> 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).
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).
Re: Umgebung setzen mit BASH-Script ?
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">
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">