Where to declare environment variables?
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
The Ubuntu page recommends ~/.pam_environment
, which is loaded by the PAM system when your session is started (TTY, GUI, SSH, etc.). It is the user-equivalent of /etc/environment
and uses the same syntax. The link suggests alternatives if that doesn't work:
~/.profile
for most shells. This file may also be applied to your GUI session by the display manager, but this need not be the case for all display managers or display servers (X11 vs Wayland) or sessions.
And bash-specific:
~/.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".
I think the community wiki page on environment variables will help you sort out
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.