user167792
user167792

Reputation:

Setting Enviroment Variables Dynamically on Linux

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?

Upvotes: 0

Views: 3081

Answers (5)

Bryan Oakley
Bryan Oakley

Reputation: 386342

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.

Upvotes: 2

Nadir SOUALEM
Nadir SOUALEM

Reputation: 3515

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

Upvotes: 0

paxdiablo
paxdiablo

Reputation: 882606

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.

Upvotes: 3

user50049
user50049

Reputation:

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.

Upvotes: 2

radical
radical

Reputation: 4424

On the shell prompt:

$ source script.sh

And set the env vars in script.sh

Upvotes: 0

Related Questions