Hi, Consider my file test.scm: (define (main args) (let* ((myvar (string-append "export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH")) (statement1 (system (string-append "echo " myvar " >> $HOME/.bashrc"))) (statement2 (system myvar))) (write myvar))) At the terminal: mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH /home/mbc/.guix-profile/share/guile/site/3.0 mbc@HP8300:~/temp$ guile -e main -s test.scm "export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH" mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH /home/mbc/.guix-profile/share/guile/site/3.0 At the end of .bashrc I see the last line is: export GUILE_LOAD_PATH=/some/random/text:/home/mbc/.guix-profile/share/guile/site/3.0 If I close and reopen the terminal and: mbc@HP8300:~$ echo $GUILE_LOAD_PATH /some/random/text:/home/mbc/.guix-profile/share/guile/site/3.0 So statement1 works as expected, modifying .bashrc which is then effective in modifying GUILE_LOAD_PATH on future invocations of terminal. statement2 is an attempt to modify the current running environment, but fails. Note that if I paste export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH directly into the terminal, that successfully modifies the variable. Why does (system myvar) i.e. (system "export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH") fail? Thanks Mortimer
Dear Mortimer, On Thu, 2021-09-02 at 15:49 -0400, Mortimer Cladwell wrote: > Hi, > > Consider my file test.scm: > > (define (main args) > (let* ((myvar (string-append "export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH")) > (statement1 (system (string-append "echo " myvar " >> > $HOME/.bashrc"))) > (statement2 (system myvar))) > (write myvar))) > > At the terminal: > > mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH > /home/mbc/.guix-profile/share/guile/site/3.0 > > mbc@HP8300:~/temp$ guile -e main -s test.scm > "export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH" > > mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH > /home/mbc/.guix-profile/share/guile/site/3.0 > > At the end of .bashrc I see the last line is: > > export > GUILE_LOAD_PATH=/some/random/text:/home/mbc/.guix- > profile/share/guile/site/3.0 > > If I close and reopen the terminal and: > > mbc@HP8300:~$ echo $GUILE_LOAD_PATH > /some/random/text:/home/mbc/.guix-profile/share/guile/site/3.0 > > So statement1 works as expected, modifying .bashrc which is then > effective > in modifying GUILE_LOAD_PATH on future invocations of terminal. > > statement2 is an attempt to modify the current running environment, but > fails. > Note that if I paste export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH directly into the > terminal, that successfully modifies the variable. > > Why does (system myvar) i.e. (system "export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH") fail? > The "system" call executes in a separate environment which is exited when the call finishes. Instead you want to use the "setenv" procedure instead: (setenv "GUILE_LOAD_PATH" (string-append "/some/random/text:" (getenv "GUILE_LOAD_PATH"))) Or in this particular case, use the "add-to-load-path" procedure: https://www.gnu.org/software/guile/manual/html_node/Load-Paths.html Kind regards, Roel Janssen
On 02.09.2021 21:49, Mortimer Cladwell wrote: > Hi, > > Consider my file test.scm: > > (define (main args) > (let* ((myvar (string-append "export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH")) > (statement1 (system (string-append "echo " myvar " >> > $HOME/.bashrc"))) > (statement2 (system myvar))) > (write myvar))) > > At the terminal: > > mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH > /home/mbc/.guix-profile/share/guile/site/3.0 > > mbc@HP8300:~/temp$ guile -e main -s test.scm > "export GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH" > > mbc@HP8300:~/temp$ echo $GUILE_LOAD_PATH > /home/mbc/.guix-profile/share/guile/site/3.0 > > At the end of .bashrc I see the last line is: > > export > GUILE_LOAD_PATH=/some/random/text:/home/mbc/.guix-profile/share/guile/site/3.0 > > If I close and reopen the terminal and: > > mbc@HP8300:~$ echo $GUILE_LOAD_PATH > /some/random/text:/home/mbc/.guix-profile/share/guile/site/3.0 > > So statement1 works as expected, modifying .bashrc which is then effective > in modifying GUILE_LOAD_PATH on future invocations of terminal. > > statement2 is an attempt to modify the current running environment, but > fails. > Note that if I paste export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH directly into the > terminal, that successfully modifies the variable. > > Why does (system myvar) i.e. (system "export > GUILE_LOAD_PATH=/some/random/text:$GUILE_LOAD_PATH") fail? > Thanks > Mortimer > Hi Mortimer, The "system" procedure starts a child-process in the operating system. In the Unix process model, the changes to the environment made by a child process do not affect the parent. Note that anything for which you use "system" above can be done directly within Guile by using the appropriate procedures, instead of starting a child process using the system shell. You might want to look for I/O related procedures to figure out how you can append text to an existing file. This might help: https://www.gnu.org/software/guile/manual/html_node/File-Ports.html Setting an environment variable is simple, just use 'setenv': https://www.gnu.org/software/guile/manual/html_node/Runtime-Environment.html Hope that helps. :-) -- Taylan
Il giorno gio, 02/09/2021 alle 22.06 +0200, Roel Janssen ha scritto: > > Or in this particular case, use the "add-to-load-path" procedure: > https://www.gnu.org/software/guile/manual/html_node/Load-Paths.html > An example usage of "add-to-load-path" is avalilable in Haunt, the static blog builder In haunt/ui.scm on line 130 (if my checkout is current) The first thing the "haunt" command does is it adds the current folder (getcwd) to the load path so that the rest of the haunt code base can be found Hope this helps