Hi,
Ich muss unter gewissen Umständen bestimmte Variablen setzten, leider sind die Umstände so bestimmt das ich diese Variablen nicht in der .bashrc setzten kann. Also dachte ich mir, kein Problem dafür gibt es Skripte. Nun glaube ich das was ich vorhabe geht generell garnicht. Folgendes Skript:
WRAPLIB=$HOME/SHMEM/lib/libshmemWrap.so
if [ -e $WRAPLIB ] then export LD_PRELOAD=${LD_PRELOAD:-$WRAPLIB} echo $LD_PRELOAD else echo "$WRAPLIB does not exists!" fi
Soweit sogut, nur nach Ausführung des Skriptes ist die Variable $LD_PRELOAD nicht gesetzt.
$ echo $LD_PRELOAD
$
...kurzer Moment der Verwunderung.... Alles klar! Kann ja nicht, wie soll die Bash denn aus einem Kind-Prozess eine Variable an den Eltern-Prozess vererben !?! Auch das The Linux Documentation Project sagt dazu:
"A script can export variables only to child processes, that is, only to commands or processes which that particular script initiates. A script invoked from the command-line cannot export variables back to the command-line environment. Child processes cannot export variables back to the parent processes that spawned them."
Das sieht schon mal ziemlich endgültig aus und macht dummerweise auch noch Sinn. Nun bräuchte ich aber leider wirklich eine Lösung die genau das macht. Da kommen noch ein paar mehr Variablen dazu die ich hier aus Gründen der Übersichtlichkeit weggelassen habe. Hat einer von euch ne gute Idee wie man das erreichen kann ohne die ganzen export's auf der Konsole zu Tippen ?
Ich bin für jede Antwort Dankbar.
Beste grüße, Sebastian
Ohne das jetzt gerade ausprobieren zu können - klappt es eventuell wenn du das skript mittels '. skript.sh' oder 'source skript.sh' ausführst? Afair führt das das Skript in der aktuellen Shell Instanz aus und macht eben keinen Kindprozess auf.
Grüße, Jens
-- Jens Krämer jk@jkraemer.net
Am 15.06.2012 um 20:28 schrieb Sebastian Oeste oeste.sebastian@googlemail.com:
Hi,
Ich muss unter gewissen Umständen bestimmte Variablen setzten, leider sind die Umstände so bestimmt das ich diese Variablen nicht in der .bashrc setzten kann. Also dachte ich mir, kein Problem dafür gibt es Skripte. Nun glaube ich das was ich vorhabe geht generell garnicht. Folgendes Skript:
WRAPLIB=$HOME/SHMEM/lib/libshmemWrap.so
if [ -e $WRAPLIB ] then export LD_PRELOAD=${LD_PRELOAD:-$WRAPLIB} echo $LD_PRELOAD else echo "$WRAPLIB does not exists!" fi
Soweit sogut, nur nach Ausführung des Skriptes ist die Variable $LD_PRELOAD nicht gesetzt.
$ echo $LD_PRELOAD
$
...kurzer Moment der Verwunderung.... Alles klar! Kann ja nicht, wie soll die Bash denn aus einem Kind-Prozess eine Variable an den Eltern-Prozess vererben !?! Auch das The Linux Documentation Project sagt dazu:
"A script can export variables only to child processes, that is, only to commands or processes which that particular script initiates. A script invoked from the command-line cannot export variables back to the command-line environment. Child processes cannot export variables back to the parent processes that spawned them."
Das sieht schon mal ziemlich endgültig aus und macht dummerweise auch noch Sinn. Nun bräuchte ich aber leider wirklich eine Lösung die genau das macht. Da kommen noch ein paar mehr Variablen dazu die ich hier aus Gründen der Übersichtlichkeit weggelassen habe. Hat einer von euch ne gute Idee wie man das erreichen kann ohne die ganzen export's auf der Konsole zu Tippen ?
Ich bin für jede Antwort Dankbar.
Beste grüße, Sebastian
Lug-dd maillist - Lug-dd@mailman.schlittermann.de https://ssl.schlittermann.de/mailman/listinfo/lug-dd
Sebastian Oeste oeste.sebastian@googlemail.com (Fr 15 Jun 2012 20:28:30 CEST):
Hi,
Ich muss unter gewissen Umständen bestimmte Variablen setzten, leider sind die Umstände so bestimmt das ich diese Variablen nicht in der .bashrc setzten kann.
Dort gehörte sie auch nicht rein, sondern in .bash_profile oder ihre direkten Verwandten.
Also dachte ich mir, kein Problem dafür gibt es Skripte. Nun glaube ich das was ich vorhabe geht generell garnicht. Folgendes Skript:
WRAPLIB=$HOME/SHMEM/lib/libshmemWrap.so
if [ -e $WRAPLIB ] then export LD_PRELOAD=${LD_PRELOAD:-$WRAPLIB} echo $LD_PRELOAD else echo "$WRAPLIB does not exists!" fi
Soweit sogut, nur nach Ausführung des Skriptes ist die Variable $LD_PRELOAD nicht gesetzt.
Genau. So wie Du auch rausgefunden hast, wird das nicht gehen. Der andere schon genannte Vorschlag sollte gehen, den Script nicht als Script aufzurufen, sondern zu „sourcen“.
Oder alles in eine Shell-Funktion zu stecken, Du Du in der .bash_profile definierst und bei Bedarf aufrufst. Geht natürlich nur, solange Du das aus der Shell heraus machst.
Oder eine Kombination aus beidem: Source-File in Verbindung mit einer Shell-Funktion, die nur „source $HOME/shmmemwrap.sh“ aufruft.
Morgen,
Am 15.06.2012 20:28, schrieb Sebastian Oeste:
Hat einer von euch ne gute Idee wie man das erreichen kann ohne die ganzen export's auf der Konsole zu Tippen ?
Ich bin für jede Antwort Dankbar.
Kann der ChildProzess am Ende nicht wieder den ParentProzess aufrufen und ein Argument übergeben? Der ParentProzess muss dann natürlich noch eine Gabelung bekommen.
Beste grüße, Sebastian
Grüße, Robert
Hi,
On Tuesday 19 June 2012, Robert wrote:
Morgen,
Am 15.06.2012 20:28, schrieb Sebastian Oeste:
Hat einer von euch ne gute Idee wie man das erreichen kann ohne die ganzen export's auf der Konsole zu Tippen ?
Ich bin für jede Antwort Dankbar.
Kann der ChildProzess am Ende nicht wieder den ParentProzess aufrufen und ein Argument übergeben?
Nein. Wir sind hier ja nicht in Redmond - Unix/Linx-Prozesse sind ordentlich voneinander isoliert. Umgebungsvariablen können nur vom Prozess selbst für sich gesetzt oder beim Erzeugen des Prozesses vererbt werden. Es ist nicht möglich andere Prozesse zu manipulieren (außer mit dem Debugger). Oder wie fändest Du es wenn ein durchgeknalltes Script Dir die ganze Session zerstören könnte?
Der ParentProzess muss dann natürlich noch eine Gabelung bekommen.
Das muss dem Prozess aber weh tun! ... ;-)
Es gibt zwei Techniken, wie man einer aufrufenden Shell Daten übergeben kann, die eine wurde schon erwähnt: source. Die andere: gib die notwendigen Shell-Befehle auf stdout aus und rufe das Script mit eval auf:
--script.sh-- ... echo MYVAR=myvalue echo export MYVAR ----
eval `script.sh`
Du kannst auch beides kombinieren, um dem Nutzer die Wahl zu lassen:
--script.sh-- #fuer source MYVAR=myval export MYVAR #fuer eval echo MYVAR=$MYVAR echo export MYVAR ----
Aus dem Kontext schließe ich allerdings mal haarscharf dass Du lediglich ein anderes Programm mit einem spezifischen LD_PRELOAD starten willst, also warum nicht einfach einen Wrapper für das Programm bauen?
--myprog.sh-- export LD_PRELOAD=something.so exec /usr/local/bin/myprog echo Ups, myprog startet nicht. exit 1 ----
Wenn Du jetzt noch das Script in "myprog" statt "myprog.sh" umbenennst, es in $HOME/bin legst und dafür sorgst dass $HOME/bin vor allem anderen in $PATH steht, dann bist Du alle Sorgen los.
Konrad
lug-dd@mailman.schlittermann.de