0

Let's say I have the following export in my ~/.bashrc

export MODE=vanilla
export PATH=/opt/bin/:/usr/bin/

And two scripts in my home

cat ~/setup_foo.sh
export MODE=foo
export PI_NUMBER=4
export PATH=/opt/bin/tool_foo/:$PATH

cat ~/setup_boo.sh export MODE=boo export PI_NUMBER=3 export PATH=/opt/bin/tool_boo:$PATH

The functionality I want to have:

$ echo $MODE
vanilla
echo $PATH
/opt/bin/:/usr/bin/

$ <<activate_foo>> echo $MODE foo echo $PATH /opt/bin/tool_foo/:/opt/bin/:/usr/bin/

$ <<activate_boo>> echo $MODE boo echo $PATH /opt/bin/tool_boo:/opt/bin/:/usr/bin/ --- NOTE, NO FOO HERE PRESERVED!

$ <<back_to_normal>> echo $MODE vanialla echo $PATH /opt/bin/:/usr/bin/ --- NO FOO AND BOO HERE!

What sort of tools, packages, bash should I use intsead of << pseudo commands >> ?

If I just call ~/.setup_foo.sh it will overwrite variable, but do not clean up PATH

2 Answers2

1

Probably the simplest thing is to start a new bash shell and source the setup file, then exit from the shell to get back to your previous environment. Ex.:

$ printenv grep '[bf]oo'

$ bash --rcfile setup_foo.sh $ printenv | grep '[bf]oo' MODE=foo PATH=/opt/bin/tool_foo/:/home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ exit exit $ printenv grep '[bf]oo'

$ bash --rcfile setup_boo.sh $ printenv | grep '[bf]oo' MODE=boo PATH=/opt/bin/tool_boo:/home/steeldriver/bin:/home/steeldriver/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ exit exit $ printenv grep '[bf]oo'

steeldriver
  • 136,215
  • 21
  • 243
  • 336
  • you could also combine/concat files --rcfile <(cat ~/.profile setup.sh) –  Oct 13 '20 at 14:25
0

By deleting old entries first, you can prevent them from appearing multiple times.

#!/bin/bash

NEW_PATH=/opt/bin PATH=$NEW_PATH:${PATH//$NEW_PATH:/} echo $PATH

And to remove your entry completely.

PATH=${PATH//$NEW_PATH:/} echo $PATH

Another example using extglob list to handle multiple paths at once.

#!/bin/bash

shopt -s extglob

FOO_PATH=/opt/foo BAR_PATH=/opt/bar

PATH=$FOO_PATH:$BAR_PATH:${PATH//@($FOO_PATH|$BAR_PATH):/}