Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

What are correct places for:

  1. Global environment variables meant to affect all users?
  2. User-specific environment variables?
share|improve this question

4 Answers 4

up vote 6 down vote accepted

I think this will help you sort out

share|improve this answer
2  
The problem is that the linked document is confused and/or plain wrong in the part of user-specif variables. I still am trying to find a shell-agnostic way to do it. $HOME/.profile is probably the best bet... –  Rmano Jan 19 '12 at 15:49

To add to sagarchalise's answer, I can summarize what the link suggests as appropriate places for settings.

For global settings, system-wide environment variables

  • Use /etc/environment
  • don't use /etc/profile, or /etc/bash.bashrc

From the page :

/etc/environment [...] is specifically meant for system-wide environment variable settings. It is not a script file, but rather consists of assignment expressions, one per line. Specifically, this file stores the system-wide locale and path settings.

Using /etc/profile is a very Unix-y way to go, but its functionality is greatly reduced under Ubuntu. It exists only to point to /etc/bash.bashrc and to collect entries from /etc/profile.d .

On my system, the only interesting entry entry in profile.d is /etc/profile.d/bash_completion.sh .

For local or per-user settings

A previous version of the Ubuntu page recommended ~/.pam_environment , but the page currently suggests that if that doesn't work, you should use

  • ~/.profile - This is probably the best file for placing environment variable assignments in, since it gets executed automatically by the DisplayManager during the startup process desktop session as well as by the login shell when one logs-in from the textual console.

  • ~/.bash_profile or ~./bash_login - If one of these exists, bash executes it instead of "~/.profile" when bash is started as a login shell. Bash will prefer ~/.bash_profile to ~/.bash_login. [...] These files won't influence a graphical session by default."

  • ~/.bashrc - "... may be the easiest place to set variables".

share|improve this answer
    
Which programs read /etc/environment and when? It doesn't seem to work with cron, even when using SHELL=/bin/bash –  SystemParadox Mar 11 '13 at 10:49
    
It appears that /etc/environment is part of PAM, which means that it should set the default environment for all processes. cron is special (that is, broken) in specifically overwriting this environment with it's own. –  SystemParadox Mar 12 '13 at 9:32
    
so how does .bashrc behave? after bash_profile? instead of .profile? –  opensas Aug 1 '13 at 18:50
    
@opensas You probably should ask as a separate question, referencing this one or the answer. –  belacqua Aug 1 '13 at 21:21

You've got:

/etc/profile: system-wide .profile file for the Bourne shell (sh(1)) and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

which in Lucid and Maverick run

/etc/profile.d/*.sh

if present, and if the user's shell is bash:

/etc/bash.bashrc

For user environment, there is a confusing array specific to the shell and whether it is considered a "login shell". If the shell is bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

for sh/dash:

$HOME/.profile

for zsh, I'm not even going to try to make sense of this.

share|improve this answer

As recommended on https://help.ubuntu.com/community/EnvironmentVariables:

  1. Global environment variables meant to affect all users should go in /etc/environment.

  2. User-specific environment variables should be set in ~/.pam_environment.

Avoid the profile and rc files for setting environment variables on Ubuntu. They have caused me more headaches than they are worth.

This is easier said than done however ;)

It is possible that you may run into the same configuration gap that existed for me. See the workaround for encrypted home below.

My ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Why the ugly static path? ${PATH} would not work for me. I bricked my login several times trying to work around it so I am sticking with the ugly static copy of the defaults :)

Workaround for Encrypted Home Folders

In Ubuntu releases up to and including Precise 12.04 Beta 2, if you are using an encrypted home directory you will need to modify /etc/pam.d/common-session to get it to load ~/.pam_environment. This solution apparently works for earlier releases, but I have not tested it.

Guenther Montag (g-montag) wrote on 2010-08-19:

This seems to be an issue with encrypted home directories. I added

session required pam_env.so

at the end of /etc/pam.d/common-session and now ~/.pam_environment gets read. On another system without encrypted home directories (also 10.04) the work around is not needed. Perhaps in my case the system tries to read ~/.pam_environment before it is decrypted.

Adapted from my answer on Super User: http://superuser.com/a/408373/66856

share|improve this answer
    
This is still wrong: ${HOME} won't work either. There is no expansion in .pam_environment. –  detly Aug 7 at 3:47

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.