Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting environment variable globally without restarting Ubuntu

I know that system wide environment variables can be set by adding entries into

/etc/environment 

or

/etc/profile 

But that requires system restart or X restart.

Is it possible to set an environment variable in Ubuntu / Linux so that immediately available system wide without restarting OS or logging out the user?

like image 671
Abhijeet Pathak Avatar asked Dec 30 '11 08:12

Abhijeet Pathak


People also ask

How can I permanently save environment variables in Ubuntu?

To make permanent changes to the environment variables for all new accounts, go to your /etc/skel files, such as . bashrc , and change the ones that are already there or enter the new ones. When you create new users, these /etc/skel files will be copied to the new user's home directory.

How do I create a permanent environment variable in Linux?

You can set an environment variable permanently by placing an export command in your Bash shell's startup script " ~/. bashrc " (or "~/. bash_profile ", or " ~/. profile ") of your home directory; or " /etc/profile " for system-wide operations.

How do you set an environment variable globally?

Search and select System (Control Panel). Click on the Advanced system settings link and then click Environment Variables. Under the section System Variables, select the environment variable you want to edit, and click Edit. If the environment variable you want doesn't exist, click New.


1 Answers

The simple answer is: you cannot do this in general.

Why can there be no general solution?

The "why?" needs a more detailed explanation. In Linux, the environment is process-specific. Each process environment is stored in a special memory area allocated exclusively for this process.

As an aside: To quickly inspect the environment of a process, have a look at /proc/<pid>/env (or try /proc/self/env for the environment of the currently running process, such as your shell).

When a ("parent") process starts another ("child") process (via fork(2)), the environment the environment of the parent is copied to produce the environment of the child. There is no inheritance-style association between those two environments thereafter, they are completely separate. So there is no "global" or "master" environment we could change, to achieve what you want.

Why not simply change the per-process environment of all running processes? The memory area for the environment is in a well-defined location (basically right before the memory allocated for the stack), so you can't easily extend it, without corrupting other critical memory areas of the process.

Possible half-solutions for special cases

That said, one can imagine several special cases where you could indeed achieve what you want.

  • Most obviously, if you do "size-neutral" changes, you could conceivable patch up all environments of all processes. For example, replace every USER=foo environment variable (if present), with USER=bar. A rather special case, I fear.

  • If you don't really need to change the environments of all processes, but only of a class of well-known ones, more creative approaches might be possible. Vorsprung's answer is an impressive demonstration of doing exactly this with only Bash processes.

There are probably many other special cases, where there is a possible solution. But as explained above: no solution for the general case.

like image 107
earl Avatar answered Sep 20 '22 04:09

earl