Du sagst im Skript nicht. Hmmm, ich nehme mal an, das ist nicht gerade das, was ich eine detailierte Fehlerbeschreibung nennen würde. Aber ich kann mir auch so denken was passiert.... Wenn du das als Skript verwendest, werden wahrscheinlich nicht einmal die Ausgaben am Ende des Programmes stattfinden richtig?
Das Problem liegt darin, wie Dir mit dem obigen Programm vorgespielt wird, das Umgebungsvariablen verändert wurden. Also ich erzähl mal Schritt für Schritt was da passiert. Wir nehmen den ersten Fall, du tippst alle Befehle in die bash ein. Das läuft so ab:
- Du setzt die Umgebungsvariablen a und b
- Du startest das Tausch-Programm und übergibst ihm die Namen der zu vertauschenden Variablen. Das Programm wird in einem neuen Prozess, als Kindprozess Deiner Bash gestartet.
- Im Tauschprogramm werden nun die Inhalte der beiden Umgebungsvariablen vertauscht. Dies geschieht aber in der Umgebung des Tauschprogramms, nicht in der Umgebung des Elternprozess.
- Jetzt kommt der fiese Trick/Fehler in dem Programm. Mit dem Befehl
startest Du eine weitere Bash. Diese ist nun ein Kindprozess des Tauschprogramms und kopiert die Umgebung des Tauschprogramms. In dieser Umgebung befinden sich nun ebenfalls die vertauschten Variablen.
- In dieser neuen Bash gibst Du nun die echo-Befehle ein, die Dir den Inhalt der Umgebungsvariablen a und b ausgeben. Dieser Inhalt ist tatsächlich vertauscht. Aber bedenke: Wir befinden uns bereits im Kind-Kind-Prozess der ursprünglichen Shell. Und zur Zeit laufen immer noch alle 3 Prozesse! Und die Variablen a und b die Du hier abfragst sind schon lange nicht mehr die ursprünglichen die Du vertauschen wolltest.
Dir ist das mit der neuen Bash wahrscheinlich aus dem Grund nicht aufgefallen, weil sie im selben Fenster läuft wie die ursprüngliche. Aber Du kannst das schnell überprüfen, indem Du die oben genannten Schritte noch einmal durchführst und dann beginnst die Prozesse Schritt für Schritt zu beenden. Also nachdem Du das "positive" Ergebnis gesehen hast, gibst Du einmal "exit" ein. Die Kind-Kind-Shell wird beendet. Aber was ist das?! Das Fenster ist noch auf!
Richtig, denn nach dem der "system("/bin/bash")"-Befehl nun endlich zurückgekehrt ist, kann das Tauschprogramm fortfahren. Naja, witzig wäre wenn ich noch ein paar printf's wären, die ausgaben würdest du nämlich jetzt erst bekommen. Aber das Programm beendet sich jetzt mit "return 0". Damit ist jetzt auch der letzte Kindprozess beendet. Die Beendigung dieses Prozesses hast Du aber auf dem Bildschirm nicht mitbekommen.
Jedenfalls sind wir nun endlich in der "richtigen" also der ursrünglichen Bash angekommen. Frage doch jetzt nochmal per echo den Inhalt der Variablen ab! Jetzt sollte zu sehen sein, daß sie sich in Wahrheit nicht verändert haben und jede ihren ursprünglichen Wert besitzt.
Puh! Muss ich jetzt noch erklären warum das Skript Dir das alles nicht vorgaukelt?
Ok, ganz kurz, ich nehme an, jetzt sollte es ohnehin schon klar sein.
Also Du startest eine Bash (1. Prozess). Du startest das Skript(2.). Das skript startet das Programm(3. Proc). Im 3. Proc werden die Variablen vertauscht. Bisher gibt es nicht mal eine Ausgabe auf der Console. Das Programm startet eine neue Bash. Die neue Bash wartet auf deine Eingabe! An dieser Stelle dachtest Du wahrscheinlich, das Skript sei zu Ende und es wäre überhaupt nichts passiert, denn auf der Console gibt es bislang noch keine Ausgaben.
Irrtum! Beweis: Gib "exit" ein. Die Bash wird beendet. Das Programm wird beendet. (Damit ist die letzte Umgebung verschwunden in der die Variablen vertauscht waren). Wir befinden uns jetzt wieder im Skript-Prozess. Dieser gibt nun die Variablen aus, die sich nicht verändert haben. Dann beendet sich der skript prozess und wir sind in der ursprünglichen Bash. Falls die Variablen erst im Skript erzeugt und mit "export" zu Umgebungsvariablen wurden, dann sind sie jetzt nicht einmal mehr vorhanden, was leicht mit echo nachzuprüfen ist.
Ok, damit sollte alles klar sein.
Wozu brauchst Du das überhaupt? Ich meine das geht mit Bash-Boardmitteln doch viel einfacher! Sowas ist schneller geschrieben, genau genommen innerhalb von 45 Sekunden, wenn man echt langsam ist, und ist auch schneller in der Performance, da keine neuen Prozesse gestartet werden müssen. Wenn es echt nur um das Vertauschen zweier Variablen innerhalb des Skripts geht, dann macht man das so:
Code:
# Initialisierung
a=14
b=10
# Vertauschung
tmp=$b
b=$a
a=$tmp
Wenn es Dir darum geht, diesen kurzen Programmcode nicht überall im skript zu wiederholen, da er häufig vorkommt, dann schreib Dir doch eine Funktion/Makro. Syntax dazu findest Du hier:
http://www.ss64.com/bash/function.html
Ich hoffe das hilft Dir weiter.
Ein Prozess kann und sollte auch nicht in dem Adressraum (Speicherbereich) eines anderen herumfuhrwerken.
PS: Liest man solange Postings überhaupt?