What is the best place to setup system wide environment variables on Linux?
Solution 1:
For Ubuntu, and possibly other *nix platforms, add a new script in /etc/profile.d
named java.sh
, such as:
echo "export JAVA_HOME=/usr/lib/jvm/default-java" > /etc/profile.d/java.sh
Other considerations that were ruled out:
/etc/environment
- works but is harder to maintain using other tools (or people will edit it); and/etc/profile
- same drawbacks as/etc/environment
Solution 2:
On Debian/Ubuntu that would be /etc/environment
I don't know the Red Hat equivalent.
Solution 3:
I don't understand why you ruled out /etc/profile. That is the correct location.
Solution 4:
A few have answered saying that /etc/environment
is depricated and/or not used in Debian anymore, and this is (as at version 7) false.
The file is actually read by PAM -- specifically, pam_env(8)
, via a default to the envfile
flag. The manpage also states this default under the FILES section.
The wikis quoted (especially the locale one) merely state that locale-based environment variables are now meant to be in /etc/profile
. Their statement "(in older versions of Debian, also /etc/environment)" is vague, and is in the context of locales.
A quick grep through /etc/pam.d
shows:
root@box:/etc/pam.d# grep pam_env.so *
atd:auth required pam_env.so
cron:session required pam_env.so
cron:session required pam_env.so envfile=/etc/default/locale
login:session required pam_env.so readenv=1
login:session required pam_env.so readenv=1 envfile=/etc/default/locale
sshd:auth required pam_env.so # [1]
sshd:auth required pam_env.so envfile=/etc/default/locale
su:session required pam_env.so readenv=1
su:session required pam_env.so readenv=1 envfile=/etc/default/locale
Those config lines are additive, and as the first is missing envfile
, it thus defaults to /etc/environment
.
All of this, of course, relies on whatever binary you're using (crond
, login shells etc) are compiled against PAM.
Finally, this implies that other systems using PAM (eg RedHat), behave the same, as can be seen in it's respective manpage.
Solution 5:
/etc/enviroment
is no used in the last debian stable release. The recomendation is create your own *.sh
file in /etc/profile.d/
for this porpuose as Sorin S saids. See https://wiki.debian.org/EnvironmentVariables