change environment variable via script

Eric "Shubes" plug at shubes.net
Fri Dec 23 11:04:52 MST 2005


Nice solution.

Alternatively, you could have done:
$ . ./cvsswitch two

Notice the '. ' before the command, which executes the command in the 
current shell without starting a new one.


Scott wrote:
> Alex,
> 
> The script itself is a shell session, so as soon as it ends, all 
> information contained within would be eliminated and not carried over to 
> your current environment.  A solution is to functionalize the script, 
> like this:
> 
> ----------------------------------------------------------
> cvsswitch() {
> echo "Selected server : "$1;
> 
> case "$1" in
>  one)
>    CVSROOT=":ext:alex at cvs.one.net 
> <mailto:alex at cvs.one.net>:/var/lib/cvs"; export CVSROOT;
>  ;;
>  two)
>    CVSROOT=":ext:alex at cvs.two.net 
> <mailto:alex at cvs.two.net>:/var/lib/cvs"; export CVSROOT;
>  ;;
>  *)
>    echo '???';
>    exit 0;
> esac
> 
> echo "CVSROOT value at end of script : "$CVSROOT;
> exit 0;
> }
> ----------------------------------------------------------
> 
> As you can see, the command name remains the same, and you would just 
> have to write the script *into* your ~/.bash_profile and source it and 
> it would then work within any environment instead of within its own.  
> Hope this helps.
> 
> -Scott
> 
> 
> Alex Dean wrote:
> 
>> I'm using bash (on OSX).  In ~/.bash_profile, I have a CVSROOT 
>> variable set so I can connect to 1 CVS server.  I occasionally want to 
>> connect to another cvs server, so I wrote a shell script to set a new 
>> CVSROOT value for me.  The script appears to set the value correctly, 
>> but it doesn't change my environment settings outside of the script.  
>> It seems like it's a global vs. local variable issue. (CVSROOT is set 
>> differently within the context of the script, but is the change is 
>> forgotten when the script exits.)  I don't do shell scripts very 
>> often, so I'm probably missing something really obvious.  How do I 
>> tell the script I want to change the value 'for real'?
>>
>> This is the script :
>> #!/bin/sh
>> echo "Selected server : "$1;
>>
>> case "$1" in
>>   one)
>>     CVSROOT=":ext:alex at cvs.one.net 
>> <mailto:alex at cvs.one.net>:/var/lib/cvs"; export CVSROOT;
>>   ;;
>>   two)
>>     CVSROOT=":ext:alex at cvs.two.net 
>> <mailto:alex at cvs.two.net>:/var/lib/cvs"; export CVSROOT;
>>   ;;
>>   *)
>>     echo '???';
>>     exit 0;
>> esac
>>
>> echo "CVSROOT value at end of script : "$CVSROOT;
>> exit 0;
>>
>> And here's a session which -should- switch from server 'one' to server 
>> 'two', but it doesn't...
>>
>> sod:~/scripts alex$ echo $CVSROOT
>> :ext:alex at cvs.one.net <mailto:alex at cvs.one.net>:/var/lib/cvs
>> sod:~/scripts alex$ ./cvsswitch two
>> Selected server : 'two'
>> CVSROOT value at end of script : ':ext:alex at cvs.two.net 
>> <mailto:alex at cvs.two.net>:/var/lib/cvs'
>> sod:~/scripts alex$ echo $CVSROOT
>> :ext:alex at cvs.one.net <mailto:alex at cvs.one.net>:/var/lib/cvs
>> sod:~/scripts alex$
>>
>> You can see the script set the variable correctly, but the change 
>> didn't apply outside of the script.  Why doesn't this work?!
>>
>> thanks,
>> alex
>> .
>>
>>
>>


-- 
-Eric 'shubes'
"There is no such thing as the People;
  it is a collectivist myth.
  There are only individual citizens
  with individual wills
  and individual purposes."
-William E. Simon (1927-2000),
     Secretary of the Treasury (1974-1977)
  "A Time For Truth" (1978), pg. 237

****************************************************
This message has been scanned using Contraxx
Technology Group mail server v8.0.3 and is virus free.
Message sent from Mail Server 3
****************************************************


More information about the PLUG-discuss mailing list