Umgebungsvariablen von system-Funktion zurückbekommen



  • Hallo!
    Kurz vorab: Diese Frage ist eher auf die Linux-Shell bezogen, jedoch fände ich Möglichkeiten, die Cross-Plattform sind, natürlich noch besser 🙂 , muss jedoch nicht explizit sein.

    Ich habe ein kleines Problem: Ich möchte gerne die Variablen, aus einem Shell-Script, welches ich aus C++ heraus ausgeführt habe, zurückbekommen und damit arbeiten.

    So sah mein Code bis jetzt aus:

    #include <iostream>
    #include <cstdlib>
    
    int main(int argc, char* argv[])
    {
        setenv("ist_wahr", "falsch", true);
        system("bash script.sh");
        
        if (strcmp(getenv("ist_wahr"), "wahr") == 0)
            std::cout << "Variable erfolgreich gesetzt!" << std::endl;
    
        return 0;
    }
    

    Das Bash-Script:

    #!/usr/bin/bash
    
    echo "Setze Variable..."
    ist_wahr="wahr"
    echo "Gesetzt!"
    

    Bisher funktioniert das leider nicht, auch nicht wenn ich export ist_wahr="wahr" verwende. Es bleibt bei "falsch".
    Hat jemand eine Idee dazu?



  • Was liefert denn getenv() zurück?

    char* oder std::string ?



  • @dirkb Standardmäßig sollte es ein char* sein.
    Und damit merke ich auch gleich einen Fehler den ich gemacht habe. C-Strings kann man ja gar nicht mir == vergleichen, nicht wahr?
    Das geht doch nur mit strcmp.



  • Ich hab das jetzt umgangen, indem ich, anstatt eine Variable zu setzen, eine temporäre Datei erstellt habe. Wenn du Datei existiert, wurde die Variable sozusagen gesetzt, existiert sie nicht, dann nicht.

    Problem ist daher gelöst.



  • Umgebungsvariablen werden vererbt. Wie diese Wortwahl schon andeutet, gibt es nur die Richtung zum aufgerufenen Prozess.



  • @survari sagte in Umgebungsvariablen von system-Funktion zurückbekommen:

    Ich hab das jetzt umgangen, indem ich, anstatt eine Variable zu setzen, eine temporäre Datei erstellt habe. Wenn du Datei existiert, wurde die Variable sozusagen gesetzt, existiert sie nicht, dann nicht.

    Falls die Datei nicht ein Überbleibsel eines vorherigen Aufrufs ist.

    Alternative 1: popen und das Scipt schreibt etwas nach stdout.

    Alternative 2: system auf Linux/Unix liefert den Exitcode des Shellscripts zurück



  • @manni66 Hey! Erstmal danke 🙂

    Leider habe ich beide alternativen schon ausprobiert und sie sind leider nicht für das, was ich vorhabe geeignet.

    Aber ich habe die Frage auch komplett falsch gestellt und werde sie erneut, mit mehreren Informationen und angebrachter Wortwahl posten. Vielleicht gibt es dann ein paar Möglichkeiten.