views:

99

answers:

5

I am currently looking for a way to set enviroment variables in Linux via a simple shell script. Within the script I am currently using the 'export' command, however this only has scope within the script where system-wide scope is needed.

Is there anyway I can do this via a shell script, or will another method need to be used?

A: 

On the shell prompt:

$ source script.sh

And set the env vars in script.sh

Ankit
+3  A: 

When you run a shell script, it executes in a sub-shell. What you need is to execute it in the context of the current shell, by sourcing it with:

source myshell.sh

or:

. myshell.sh

The latter is my preferred approach since I'm inherently lazy.

If you're talking about system-wide scope inasmuch as you want to affect everybody, you'll need to put your commands in a place where they're sourced at login time (or shell creation time), /etc/profile for example. Where you put your commands depends on the shell being used.

You can find out what scripts get executed by examining the man page for your shell:

man bash

The bash shell, when invoked as a login shell (including as a non-login shell but with the --login parameter), will use /etc/profile and the first of ~/.bash_profile, ~/.bash_login or ~/.profile.

Non-login bash shells will use. unless invoked with --norc or --rcfile <filename>, the files /etc/bash.bashrc and ~/.bashrc.

I'm pretty certain it's even more convoluted than that depending on how the shell is run, but that's as far as my memory stretches. The man page should detail it all.

paxdiablo
Unfortunatly the script is to be ran from a different application with several arguments (it will also be ran more than once per-login)
Michael D
You can't affect the environment of other processes directly so you may need to find another way if the bash startup execution chain is insufficient.
paxdiablo
A: 

You could have your script check for the existence of something like /var/myprog/env-vars-to-load and 'source' it then unlink it if it exists, perhaps using trap and a signal. Its hard to say, I'm not familiar with your program.

There is no way to 'inject' environmental variables into another process' address space, so you'll have to find some method of IPC which will can instruct the process on what to set.

Tim Post
A: 

test.sh

#!/bin/bash
echo "export MY_VAR=STACK_OVERFLOW" >> $HOME/.bashrc
. $HOME/.bashrc
sh task.sh

task.sh

#!/bin/sh

echo $MY_VAR

Add executable rights:

chmod +x test.sh task.sh

And lauch test.sh

./test.sh

Result:

STACK_OVERFLOW
Nadir SOUALEM
A: 

A fundamental aspect of environment variables is that you cannot affect the environment for any process but your own and child processes that you spawn. You can't create a script that sets "system wide" environment variables that somehow become usable by other processes.

Bryan Oakley