Setenv überschreibt alles



  • Hallo zusammen,

    Ich versuche gerade aus einem C++ Programm heraus eine Umgebungsvariable zu setzten. Ich möchte die Variable allerdings nicht ersetzten sondern erweitern. Ich habe es also so probiert:

    setenv("PATH", "/usr/kogmo/bin:$PATH",1);
    

    Allerdings ist die Antwort auf "echo PATH"folgende:/usr/kogmo/bin:PATH" folgende: /usr/kogmo/bin:PATH

    Hat jemand eine Idee wie ich den Inhalt von $PATH einfach um "/usr/kogmo/bin" erweitern kann?

    Gruss,
    flambert



  • Ähh... vielleicht solltest Du vorher den alten Wert abfragen.



  • Ist denn der Doppelpunkt richtig? Unter Windows wäre es ein Semikolon.

    PATH=%PATH%;C:\myDir



  • Den alten Wert versuche ich ja mit dem "..$PATH" abzufragen/dranzuhängen. Aber das will nicht. Der Doppelpunkt ist sicher richtig. So sind die Einträge der $PATH auch getrennt.



  • Noch eine kleine Ergänzung. Wenn ich z.B. die Umgebungsvariablen in der Shell ergänze mache ich das mit:

    export PATH=$PATH:/usr/kogmo/bin/
    

    Da klappt es ohne Probleme.



  • Dann mach es so, wie SG1 vorgeschlagen hat. Alten String einlesen, ergänzen und neu setzen. Offensichtlich unterstützt setenv keine Platzhalter, wie es sie auf der Konsole gibt.



  • Das $PATH wird in dem Fall aber von der Shell interpretiert. man: setenv ruft dafür aber nicht die Shell auf. Also musst du es händisch machen.

    char const *const path_env = getenv("PATH");
    string new_path = "/usr/kogmo/bin";
    if(path_env) {
      new_path += ':';
      new_path += path_env;
    }
    if(setenv("PATH", new_path.c_str(), 1) == -1) {
      perror("setenv"); // oder exception oder so
    }
    

    Wenn du kein C++ nimmst, musst du new_path eben als C-String zusammen basteln.



  • _matze schrieb:

    Unter Windows wäre es ein Semikolon.

    PATH=%PATH%;C:\myDir

    Fällt Dir an dem Code-Statement da oben etwas auf, was diese Änderung von Doppelpunkt zu Semikolon nötig machen könnte? 🙂



  • rüdiger schrieb:

    Das $PATH wird in dem Fall aber von der Shell interpretiert. man: setenv ruft dafür aber nicht die Shell auf. Also musst du es händisch machen.

    char const *const path_env = getenv("PATH");
    string new_path = "/usr/kogmo/bin";
    if(path_env) {
      new_path += ':';
      new_path += path_env;
    }
    if(setenv("PATH", new_path.c_str(), 1) == -1) {
      perror("setenv"); // oder exception oder so
    }
    

    Wenn du kein C++ nimmst, musst du new_path eben als C-String zusammen basteln.

    Besten Danke. Hat alles sehr schön funktioniert. Ich bin mit den Pointern noch nicht ganz so firm. Aber jetzt läufts.



  • nman schrieb:

    _matze schrieb:

    Unter Windows wäre es ein Semikolon.

    PATH=%PATH%;C:\myDir

    Fällt Dir an dem Code-Statement da oben etwas auf, was diese Änderung von Doppelpunkt zu Semikolon nötig machen könnte? 🙂

    Hehe, ja, macht Sinn...


Anmelden zum Antworten